Вы когда-нибудь задумывались, почему одни проекты на Yii2 растут и развиваются без боли, а другие превращаются в запутанный клубок зависимостей? Секрет часто кроется в модульной архитектуре. В этой статье я расскажу, как организовать проект так, чтобы добавление новых функций не ломало существующие, а код оставался чистым и понятным.
Что такое модульная структура и зачем она нужна
Модуль в Yii2 — это самодостаточный блок приложения, который инкапсулирует в себе логику, контроллеры, модели, представления и даже конфигурацию. Представьте себе конструктор Lego: каждый модуль — это отдельный кубик, который можно легко заменить или добавить, не разбирая всю конструкцию. В Yii2 модули позволяют разделить проект на независимые части, что упрощает разработку, тестирование и поддержку.
Зачем это нужно? Во-первых, при росте проекта вы избегаете «каши» из файлов в одной папке. Во-вторых, модули можно переиспользовать в других проектах. В-третьих, над разными модулями могут работать разные команды, не мешая друг другу.
Создаём модуль: пошаговая инструкция
В Yii2 модуль — это класс, наследующий yii\base\Module. Обычно модули размещают в папке modules на уровне приложения. Давайте создадим простой модуль для управления статьями (блог).
Шаг 1. Создайте папку modules/admin (например, для админской части). Внутри неё — структуру:
modules/
admin/
controllers/
DefaultController.php
models/
views/
default/
index.php
Module.php
Шаг 2. Создайте класс модуля Module.php:
Шаг 3. Создайте контроллер DefaultController.php:
render('index');
}
}
Шаг 4. Создайте представление views/default/index.php с любым содержимым.
Шаг 5. Подключите модуль в конфигурации приложения (обычно config/web.php):
'modules' => [
'admin' => [
'class' => 'app\modules\admin\Module',
],
],
Теперь модуль доступен по URL /admin/default/index.
admin, api, catalog. Избегайте общих имён вроде common или utils — это сбивает с толку.
Организация взаимодействия между модулями
Модули должны быть максимально независимыми. Но иногда им нужно обмениваться данными. Как это делать правильно? Используйте события (events) и сервисный слой.
Например, модуль catalog после добавления товара может генерировать событие ProductAdded. Модуль notifications подписывается на него и отправляет уведомление. Такой подход снижает связанность.
Вот пример генерации события в модели товара:
namespace app\modules\catalog\models;
use yii\base\Event;
use yii\db\ActiveRecord;
class Product extends ActiveRecord
{
const EVENT_PRODUCT_ADDED = 'productAdded';
public function afterSave($insert, $changedAttributes)
{
parent::afterSave($insert, $changedAttributes);
if ($insert) {
$this->trigger(self::EVENT_PRODUCT_ADDED);
}
}
}
А в конфигурации приложения (или в init() модуля notifications) подписываемся:
use app\modules\catalog\models\Product;
use app\modules\notifications\services\Notifier;
Event::on(Product::class, Product::EVENT_PRODUCT_ADDED, function ($event) {
(new Notifier())->sendProductAddedNotification($event->sender);
});
Такой подход позволяет легко добавлять новые обработчики без изменения кода других модулей.
Практические советы для масштабирования
Вот несколько проверенных лайфхаков, которые помогут избежать типичных ошибок при модульной разработке.
- Чётко определяйте границы модуля. Каждый модуль должен отвечать за одну бизнес-функцию. Если модуль начинает разрастаться, возможно, его стоит разделить.
- Используйте отдельные конфигурации для модулей. Например, можно создать файл
config/modules/admin.phpи подключать его в основном конфиге. Это упрощает настройку. - Не забывайте про миграции. Миграции модуля должны храниться внутри модуля (в папке
migrations). При применении миграций указывайте путь к модулю. - Тестируйте модули изолированно. Пишите unit-тесты для каждого модуля отдельно. Это помогает быстрее находить ошибки.
Сравним два подхода к организации кода: без модулей и с модулями.
| Критерий | Без модулей | С модулями |
|---|---|---|
| Структура | Все файлы в общих папках | Логика сгруппирована по модулям |
| Повторное использование | Сложно перенести часть кода | Модуль можно скопировать в другой проект |
| Командная работа | Конфликты при слиянии | Каждый разработчик работает над своим модулем |
| Тестирование | Сложно изолировать | Легко тестировать отдельно |
as access или используйте поведение AccessControl в контроллерах модуля.
Заключение
Модульная структура в Yii2 — это не просто модный тренд, а реальный способ сделать проект гибким и масштабируемым. Разбивая приложение на модули, вы облегчаете себе жизнь сегодня и завтра. Начните с малого: выделите один функциональный блок в модуль, затем другой. Постепенно вы почувствуете, как код становится чище, а разработка — быстрее.
Что в итоге? Модули дают независимость, повторное использование и порядок. Главное — не переусердствовать: не стоит делать модуль для каждой мелочи. Следуйте принципу «один модуль — одна бизнес-функция».
Студия WNDER

