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/ default/ 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
pojedynczą ścieżkę, a klucz default
musi istnieć. Na
przykład:
<?php $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:
<?php $front->addControllerDirectory('/path/to/application/news/controllers', 'news'); ?>
Zostawiając najlepsze na koniec, najprostszym sposobem określenia
katalogu modułów jest określenie ich wszystkich na raz, gdy
wszystkie moduły znajdują się w jednym katalogu i posiadają taką
samą strukturę. Można to zrobić za pomocą metody
addModuleDirectory()
:
<?php /** * Zakładając, że tak wygląda struktura katalogów: * application/ * modules/ * default/ * controllers/ * foo/ * controllers/ * bar/ * controllers/ */ $front->addModuleDirectory('/path/to/application/modules'); ?>
Powyższy przykład definiuje moduły default
,
foo
, oraz bar
, każdy wskazujący na
podkatalog controllers
danego modułu.
Możesz określić nazwę podkatalogu kontrolerów używaną w modułach
za pomocą metody setModuleControllerDirectoryName()
:
<?php /** * Zmieniamy nazwę podkatalogu kontrolerów na 'con' * application/ * modules/ * default/ * con/ * foo/ * con/ * bar/ * con/ */ $front->setModuleControllerDirectoryName('con'); $front->addModuleDirectory('/path/to/application/modules'); ?>
Notatka | |
---|---|
Możesz określić aby podkatalog kontrolerów nie był używany w
modułach, przekazując pustą wartość do metody
|
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);