7.11. Модульная структуры директорий

7.11.1. Введение

Модульная структура директорий позволяет делить различные 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?

7.11.2. Определение директорий контроллеров для модулей

Первым шагом в использовании модулей является изменение способа определения список директорий во фронт-контроллере. В основной серии 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');

7.11.3. Маршрутизация применительно к модулям

Маршрут, используемый по умолчанию в Zend_Controller_Router_Rewrite является объектом Zend_Controller_Router_Route_Module. Этот объект использует следующие схемы маршрутизации:

  • :module/:controller/:action/*

  • :controller/:action/*

Другими словами, он будет соответсвовать контроллеру и действию без модуля или контроллеру и действию с предшествующим модулем. Правила сопоставления предписывают, что модуль должен только тогда соответствовать пути, если ключ с тем же именем существует в массиве директорий контроллера.

7.11.4. Контроллер, используемый по умолчанию - для модуля или общий

В маршрутизаторе, используемом по умолчанию, если контроллер не был определен в URL, то используется контроллер по умолчанию (IndexController, если не был установлен другой). В случае использования модулей, если был определен модуль без контроллера, то диспетчер сначала ищет используемый по умолчанию контроллер в директории модуля, затем в общем пространстве имен.

Если вы хотите всегда использовать общее пространство имен, то установите параметр useGlobalDefault во фронт-контроллере:

$front->setParam('useGlobalDefault', true);