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);