Konwencjonalna modularna struktura katalogów pozwala ci na oddzielenie różnych aplikacji MVC w osobne jednostki i użycie ich z różnymi kontrolerami frontowymi. Przykładem może być taka struktura katalogów:
docroot/ index.php application/ controllers/ IndexController.php FooController.php blog/ controllers/ IndexController.php models/ views/ news/ controllers/ IndexController.php ListController.php models/ views/
W tym modelu, nazwa modułu uwidacznia się jako przedrostek nazw kontrolerów, ktore zawiera moduł. Powyższy przykład zawiera trzy kontrolery modułów, 'Blog_IndexController', 'News_IndexController', oraz 'News_ListController'. Dwa globalne kontrolery, 'IndexController' oraz 'FooController' są także zdefiniowane; żaden z nich nie posiada własnej przestrzeni nazw. Ta struktura katalogów będzie używana w przykładach w tym rozdziale.
Więc jak implementujesz taką strukturę katalogów używając komponentów MVC Zend Framework?
Pierwszym krokiem użycia modułów jest zmodyfikowanie sposobu określania listy ścieżek do kontrolerów w kontrolerze frontowym. W podstawowej wersji MVC, przekazujesz tablicę lub łańcuch znaków do metody setControllerDirectory(), lub ścieżkę do metody addControllerDirectory(). Gdy używasz modułów, musisz także odpowiednio zmienić wywołania tych metod.
W metodzie setControllerDirectory(), musisz przekazać tablicę asocjacyjną i określić pary klucz/wartość w postaci moduł/ścieżka. Specjalny klucz 'default' będzie użyty dla globalnych kontrolerów (tych, które nie potrzebują przestrzeni nazw). Wszystkie wpisy powinny zawierać łańcuch znaków wskazujący na pojedyncza ścieżkę. Na przykład:
$front->setControllerDirectory(array( 'default' => '/path/to/application/controllers', 'blog' => '/path/to/application/blog/controllers' ));
Metoda addControllerDirectory() przyjmuje opcjonalny drugi argument. Gdy używasz modułów, przekaż nazwę modułu jak drugi argument; jeśli nie określisz drugiego argumentu, ścieżka zostanie dodana dla domyślnej przestrzeni nazw. Na przykład:
$front->addControllerDirectory('/path/to/application/news/controllers', 'news');
Domyślna trasa w
Zend_Controller_Router_Rewrite
jest obiektem typu
Zend_Controller_Router_Route_Module
. Ta trasa obsługuje
takie schematy routingu:
:module/:controller/:action/*
:controller/:action/*
Innymi słowy, dopasuje ona tylko kontroler oraz akcję, lub wraz z poprzedzającym je modułem. Zasady dopasowania określają, że moduł będzie dopasowany tylko wtedy, gdy klucz o takiej samej nazwie istnieje w tablicy ze ścieżkami kontrolerów przekazanej do kontrolera frontowego i obiektu uruchamiającego.
W domyślnym routerze jeśli w URL nie został określony kontroler,
użyty zostanie domyślny kontroler (IndexController
,
jeśli nie określono inaczej). Gdy używamy kontrolerów modularnych,
jeśli moduł został określony, ale kontroler nie, obiekt
uruchamiający wpierw będzie szukał domyślnego kontrolera w ścieżce
modułu, a w drugiej kolejności będzie szukał w ścieżce dla domyślnej
globalnej przestrzeni nazw 'default'.
Jeśli chcesz zawsze używać domyślnej przestrzeni nazw, ustaw
parametr useGlobalDefault
w kontrolerze frontowym:
$front->setParam('useGlobalDefault', true);