7.7. Модульная структуры директорий
Пред. | Глава 7. Zend_Controller | След.

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

### 7.7.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.7.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.7.3. Маршрутизация применительно к модулям

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

- `:module/:controller/:action/*`

- `:controller/:action/*`

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

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

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

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

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

Пред. | Уровень выше | След.
7.6. Плагины | Начало | 7.8. Исключения