Модуль — это самодостаточная программная единица, состоящая из моделей, представлений, контроллеров и иных компонентов. Во многом модуль схож с приложением. Основное различие заключается в том, что модуль не может использоваться сам по себе — только в составе приложения. Пользователи могут обращаться к контроллерам внутри модуля абсолютно так же, как и в случае работы с обычными контроллерами приложения.
Модули могут быть полезными в нескольких ситуациях. Если приложение очень объёмное, мы можем разделить его на несколько модулей, разрабатываемых и поддерживаемых по отдельности. Кроме того, некоторый часто используемый функционал, например, управление пользователями, комментариями и пр., может разрабатываться как модули, чтобы впоследствии можно было с лёгкостью воспользоваться им вновь.
Модуль организован как директория, имя которой выступает в качестве уникального идентификатора модуля. Структура директории
модуля похожа на структуру базовой директории приложения. Ниже представлена
типовая структура директории модуля с именем forum:
forum/
ForumModule.php файл класса модуля
components/ содержит пользовательские компоненты
views/ содержит файлы представлений для виджетов
controllers/ содержит файлы классов контроллеров
DefaultController.php файл класса контроллера по умолчанию
extensions/ содержит сторонние расширения
models/ содержит файлы классов моделей
views/ содержит файлы представлений контроллера и макетов
layouts/ содержит файлы макетов
default/ содержит файлы представлений для контроллера по умолчанию
index.php файл представления 'index'
В корневой директории модуля должен находиться класс модуля, наследующий CWebModule. Имя класса определяется, используя выражение
ucfirst($id).'Module', где $id соответствует идентификатору модуля (или названию директории модуля). Класс модуля выполняет роль
центрального хранилища информации, совместно используемой компонентами модуля. Например, мы можем использовать
CWebModule::params для хранения параметров модуля, а также CWebModule::components для совместного использования
компонентов приложения на уровне модуля.
Подсказка: Для создания базового каркаса модуля можно воспользоваться генератором модулей, входящим в состав Gii.
Для использования модуля необходимо поместить папку модуля в директорию modules
базовой директории приложения. Далее необходимо объявить
идентификатор модуля в свойстве приложения modules. Например, чтобы воспользоваться модулем forum,
приведённым выше, можно использовать следующую конфигурацию приложения:
return array(
…
'modules'=>array('forum',…),
…
);Кроме того, модулю можно задать начальные значения свойств. Порядок использования такой же, как и с компонентами
приложения. Например, модуль forum может иметь в своём классе свойство с именем
postPerPage, которое может быть установлено в конфигурации приложения
следующим образом:
return array(
…
'modules'=>array(
'forum'=>array(
'postPerPage'=>20,
),
),
…
);К экземпляру модуля можно обращаться посредством свойства module активного в настоящий момент контроллера. Через экземпляр
модуля можно получить доступ к совместно используемой информации на уровне модуля. Например, для того чтобы обратиться к упомянутому выше свойству
postPerPage, мы можем воспользоваться следующим выражением:
$postPerPage=Yii::app()->controller->module->postPerPage;
// или таким, если $this ссылается на экземпляр контроллера
// $postPerPage=$this->module->postPerPage;Обратиться к действию контроллера в модуле можно, используя маршрут moduleID/controllerID/actionID.
Например, предположим, что всё тот же модуль forum имеет контроллер с именем PostController. Тогда мы можем использовать
маршрут forum/post/create для того, чтобы обратиться к действию create этого контроллера.
Адрес URL, соответствующий этому маршруту, будет таким: http://www.example.com/index.php?r=forum/post/create.
Подсказка: Если контроллер находится в подпапке папки
controllers, мы также можем использовать формат маршрута, приведенный выше. Например, предположим, что контроллерPostControllerнаходится в папкеforum/controllers/admin, тогда мы можем обратиться к действиюcreateчерезforum/admin/post/create.
Модули могут быть вложенными друг в друга сколько угодно раз, т.е. один модуль может содержать в себе другой, который содержит в себе ещё один. Первый мы будем называть модуль-родитель, второй — модуль-потомок. Модули-потомки должны быть описаны в свойстве modules модуля-родителя точно так же, как мы описываем модули в файле конфигурации приложения.
Для обращения к действию контроллера в дочернем модуле используется
маршрут parentModuleID/childModuleID/controllerID/actionID.
Found a typo, or you think this page needs improvement?
Edit it on GitHub !
Signup or Login in order to comment.