Pokazywanie postów oznaczonych etykietą php. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą php. Pokaż wszystkie posty

2015-05-02

Check permissions in ZF2 Zend/Navigation with ZfcRbac

ZfcRbac is not tailored to work with Zend/Navigation. There aren’t any builded native solutions that gives ZfcRbac permission to enable or disable entry of menu. The solution for that problem is quite simple.
I found solution in this blog: http://blog.webdevilopers.net/check-zend-navigation-page-permissions-with-zfcrbac/. I based on it. But this solution caused a problem. Positions in menu are displayed only if perrmision is defined. If permission is not defined, menu’s posiotin is displayed.
I’ll show you how to implement checking perrmisions and enabled / disabled menu positions with ZfcRbac. There is only one change in RbacListener:


class RbacListener
{
  protected $authorizationService;


  public function __construct(AuthorizationServiceInterface $authorizationService)
  {
      $this->authorizationService = $authorizationService;
  }


  public function accept(EventInterface $event)
  {
      $page = $event->getParam('page');


      if (! $page instanceof AbstractPage) {
          return;
      }


      $permission = $page->getPermission();


      if (is_null($permission)) {
          $event->stopPropagation();
          return false;
      }


      $event->stopPropagation();


      return $this->authorizationService->isGranted($permission);
  }
}

2015-05-01

Do not mess your code!

PHP is great language that gives us flexibility. PHP has weak typing. On the other side, many programmers abuse it. They create little monsters and spaghetti code.


In this post I will show you, on simple example, how you should prevent yourself from ambiguous return value.


Base principle: You should always return the same type.


My favorite example:


/**
* @return mixed
*/
public function getProductList()
{
   $resultArray = $this->products->get();


   return empty($resultArray) ? $resultArray : null;
}


What’s wrong with it? Return value is ambiguous. In next step in your code, after calling this method you must check what method returned to you.

if ($return === null) {
   //do something...
} else {
   //do something...
}


In this example you have two statements to check. More clear is this code:


/**
* @return array
*/
public function getProductList()
{
   $resultArray = $this->products->get();


   return $resultArray;
}

In above example, you always gets the same type of result. On the other hand, you may use designed pattern, but this is the other solution, not described in this post.

2014-12-01

Lokalne repozytorium Composera

Composer szybko stał się standardem do zarządzania pakietami oraz ich zależnościami dla aplikacji PHP. Dzisiaj jest to podstawowe i niemal niezbędne narzędzie do pracy i rozwoju aplikacji. W tym wpisie chcę pokazać, jak w prosty i łatwy sposób utworzyć własny pakiet - repozytorium, by następnie pobrać go za pomocą Composera. 
Oczywiście, można użyć Satis lub Toran Proxy, aczkolwiek na własne potrzeby np. testów, wystarczy prostsze rozwiązanie, które opisuje w dalszej części posta.

Repozytorium Composera możemy utworzyć we własnej sieci np. na tym samym komputerze, na którym rozwijamy główny projekt, a następnie pobierać go przez Composera, bez publikowania go na GitHUB.

Czasem może zdarzyć się taka sytuacja, kiedy nie chcemy publikować naszego pakietu i umieszczać go publicznie na GitHUB. Może to być sytuacja w której, dopiero zaczynamy pracować nad własnym pakietem, nasz pakiet może być specyficzny tylko dla naszej aplikacji i nie nadaje się dla innych aplikacji, jak również może to być rozwiązanie zamknięte rozwijane na potrzeby projektu komercyjnego.

W tym wpisie nie będę opisywał podstaw Composera. Można z nimi się zapoznać w oficjalnej dokumentacji.


Zaczynamy!

Na początku utworzymy nowy projekt. Jego struktura będzie wyglądała następująco:


main-project-directory
|-src
| \-module
|   \-Start.php
|-examples
\-test


Utwórzmy powyższą strukturę katalogów, a następnie zainicjujmy repozytorium git:


cd main-project-directory
git init
git add .
git commit -m "Pierwszy commit"


Już mamy utworzony projekt. Teraz możemy przystąpić do konfiguracji Composera w naszym projekcie. W tym celu tworzymy plik composer.json w głównym katalogu projektu, a następnie definiujemy konfigurację:


{
 "name": "my-projects/my-module",
 "description": "Description of my project",
 "type": "library",
 "license": "BSD",
 "keywords": [
   “keywords"
 ],
 "authors": [
   {
     "name": "Name Surname",
     "email": "email@email.com"
   }
 ],
 "version": "dev-master",
 "require": {
 },
 "autoload": {
   "psr-0": {
     "MyModule\\": "src/"
   }
 }
}


Z kolei w pliku composer.json projektu, do którego chcemy zaciągnąć nasz wcześniej utworzony moduł, musimy dodać wpis z repozytorium, z którego należy pobrać moduł:


{
   "name": "my_projects/main_project",
   "repositories": [{
       "type": "vcs",
        "url": "/path_to_module/my_module"
       }
   ],
   "require": {
       "my-projects/my-module" : "dev-master"
   }
}


Wartość dla “url” w sekcji "repositories" może być ścieżką na komputerze lokalnym albo adresem URL do którego jest dostęp w sieci.

Teraz wystarczy wydać polecenie > composer update, by pobrać do naszego miejsca docelowego utworzone wcześniej repozytorium.
Podczas konfiguracji composer.json w projekcie, do którego będzie zaciągane repozytorium, należy zwrócić szczególną uwagę na poprawność ścieżek - wielkość znaków ma znaczenie.