Модульная структура директорий позволяет делить различные MVC-приложения в самодостаточные единицы и повторно использовать их с различными фронт-контроллерами. Следующая структура директорий иллюстрирует это:
docroot/ index.php application/ controllers/ IndexController.php FooController.php blog/ controllers/ IndexController.php models/ views/ news/ controllers/ IndexController.php ListController.php models/ views/
В этой парадигме имена модулей используются как префиксы к контроллерам в этих модулях. Пример выше содержит три контроллера в модулях: 'Blog_IndexController', 'News_IndexController' и 'News_ListController'. Также определены два общих контроллера: 'IndexController' и 'FooController'. Эта структура директорий будет использоваться для последующих примеров в этом разделе.
Итак, как можно реализовать такую организацию на уровне директорий, используя компоненты MVC в Zend Framework?
Первым шагом в использовании модулей является изменение способа определения список директорий во фронт-контроллере. В основной серии MVC вы передаете методу setControllerDirectory() массив или строку, а методу addControllerDirectory() - путь. При использованиии модулей нужно несколько изменить вызовы этих методов.
Методу setControllerDirectory() нужно будет передавать ассоциативный массив, в котором пары 'имя модуля'-'пути директорий' определены как ключ и значение массива соответственно. Специальный ключ 'default' используется для общих контроллеров. Все ключи (имена модулей) должны указывать на единственный путь. Например:
$front->setControllerDirectory(array( 'default' => '/path/to/application/controllers', 'blog' => '/path/to/application/blog/controllers' ));
Метод addControllerDirectory() принимает необязательный второй параметр. Если используются модули, то передавайте имя модуля в качестве второго аргумента; если он не определен, то путь будет добавлен в пространство имен, используемое по умолчанию ('default'). Например:
$front->addControllerDirectory('/path/to/application/news/controllers', 'news');
Маршрут, используемый по умолчанию в Zend_Controller_Router_Rewrite
является объектом Zend_Controller_Router_Route_Module
. Этот объект использует следующие схемы маршрутизации:
:module/:controller/:action/*
:controller/:action/*
Другими словами, он будет соответсвовать контроллеру и действию без модуля или контроллеру и действию с предшествующим модулем. Правила сопоставления предписывают, что модуль должен только тогда соответствовать пути, если ключ с тем же именем существует в массиве директорий контроллера.
В маршрутизаторе, используемом по умолчанию, если контроллер не был определен в URL, то используется контроллер по умолчанию (IndexController
, если не был установлен другой). В случае использования модулей, если был определен модуль без контроллера, то диспетчер сначала ищет используемый по умолчанию контроллер в директории модуля, затем в общем пространстве имен.
Если вы хотите всегда использовать общее пространство имен, то установите параметр useGlobalDefault
во фронт-контроллере:
$front->setParam('useGlobalDefault', true);