Вы когда-нибудь задумывались, почему одни проекты на Yii2 растут и развиваются без боли, а другие превращаются в запутанный клубок зависимостей? Секрет часто кроется в модульной архитектуре. В этой статье я расскажу, как организовать проект так, чтобы добавление новых функций не ломало существующие, а код оставался чистым и понятным.

Digital-студия WNDER

Что такое модульная структура и зачем она нужна

Модуль в 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