We folderze config trzymam sobie prosty plik xml, który wgląda następująco:
<?xml version="1.0" encoding="UTF-8"?> <acl> <guest> <resource name="/" label="Strona główna" /> <resource name="/user/login" label="Zaloguj się" /> <resource name="/user/register" label="Zarejestruj się" /> </guest> <user> <resource name="/user/logout" label="Wyloguj się" /> <resource name="/user/login" label="" /> <resource name="/user/register" label="" /> </user> <moderator> </moderator> <admin> </admin> </acl>
jak widać chyba nic nie trzeba tutaj tłumaczyć, jedyne co może wzbudzać zainteresowanie to dlaczego w roli user zasoby /user/login i user/register maja pusty label, ale to później wytłumaczę, bo jest jeszcze jedna funkcjonalność tego podejścia, o której za chwile napisze.
A tak wygląda kod:
//najpierw potrzebujemy role, jest ona brana z bazy, a jeśli nie to domyślną jest guest //teraz w obiekt acl pobieramy wcześniejszy plik xml $acl = simplexml_load_file('../config/acl.xml'); //budujemy tablice dwuwymiarową z rolami i odpowiadającymi im zasobami z pliku xml foreach($acl as $role) { foreach($role as $res) { $label = (string)$res['label']; $ACL[$role->getName()][(string)$res['name']] = ($label == '') ? null : $label; } } //teraz czas na funkcje, która tworzy powiązania (dziedziczenie) ról jakie chcemy ze sobą //oraz tworzy nam na podstawie powiązań nawigacje gotową dla obecnie zalogowanego użytkownika z odpowiednią rolą //tutaj właśnie są nam potrzebne te puste atrybuty 'label' w zasobach, bo po co mamy wyświetlać zalogowanemu użytkownikowi //linki do zalogowania albo do zarejestrowania się, skoro on już to zrobił :) Dajemy mu tylko możliwość do wylogowania. :) //funkcja po prostu wyrzuca sobie takie powtarzające się zasoby z pustymi labelami i daje Nam ładną tablicę z nawigacją. function setInheritAndNav () { foreach($args as $key => $val) { if($val == null) { } } foreach($args as $tab) { $newArgs[] = $tab; } foreach($newArgs as $tab) { if($tab != null) { } } foreach($nav as $key => $val) { if($val == null) { } } return $nav; } //tutaj w prosty sposób definiujemy sobie jakie role jak mają zostać dziedziczone //korzystając z wyżej wymienionej funkcji, dziedziczenie działa od lewej strony, czyli //tak jak np. dla admina: admin -> moderator -> user -> guest ('->' oznacza 'dziedziczy po'), //a nawet mozemy zrobic tak guest -> user -> moderator -> admin :) wtedy guest dziedziczy po naszych wszystkich rolach :) $guest = setInheritAndNav($ACL['guest']); $user = setInheritAndNav($ACL['user'], $ACL['guest']); $admin = setInheritAndNav($ACL['admin'], $ACL['moderator'], $ACL['user'], $ACL['guest']); //tworzymy sobie dwuwymiarową tablicę z nawigacjami dla ról //żeby w prosty sposób sprawdzić sobie właśnie czy żądany zasób znajduje się ACL: //i działanie prostego front-controllera: //w adresie trzymam zmienną url, która przechowuje mi kombinację czystych urli np. '/index/index/' lub '/user/login' albo nic czyli '/' itp. $_controller = $urlArray[0] ? $urlArray[0] : 'index'; $_action = $urlArray[1] ? $urlArray[1] : 'index'; $_parameter = $urlArray[2] ? $urlArray[2] : '1'; $run = new $controllerName($_controller, $_action, $NAV[$rola]); $run->$_action($_parameter); } else { URL::_redirect(); }
prawie wszystko dzieje się metodą strukturalną, bo po co obciążać cały system obiektówką, tam gdzie nie jest ona potrzebna .
Chciałbym usłyszeć jakieś opinie lub uwagi co można jeszcze poprawić, usprawnić lub zmienić.