Руководство по разработке на шаблоне
В этом разделе описаны практические шаги для создания новых модулей, контроллеров, команд и использования ключевых компонентов.
Создание нового API-контроллера
- Создайте класс контроллера в core/presentation/controller/ или в модуле.
- Наследуйте его от BaseController.
- Определите действия (actionIndex, actionView, actionCreate, etc.).
- Используйте готовые методы для формирования ответов:
$this->collection(...)для списков.$this->item(...)для одного объекта.$this->success(...)для успешных операций.$this->error(...)для ошибок.
- Настройте маршруты в
config/web.phpили через правила модуля.
Пример контроллера пользователей:
namespace core\presentation\controller;
class UserController extends BaseController
{
public function actionIndex()
{
// Получить пользователей из репозитория
$users = UserRepository::find()->all();
$total = UserRepository::count();
return $this->collection($users, $total, $this->getPage(), $this->getLimit());
}
public function actionView($id)
{
$user = UserRepository::findOne($id);
if (!$user) {
return $this->error('User not found', 404);
}
return $this->item($user);
}
}
Использование Value Object IdRange
IdRange полезен для обработки параметров запроса вида ids=1,3:20,27. Он парсит строку и возвращает массив целых чисел. Пример использования:
public function actionBatch(IdRange $ids)
{
// автоматически через параметр маршрута, если тип подсказан
$users = UserRepository::findAll($ids->toArray());
return $this->collection($users);
}
Либо через ручной парсинг:
public function actionIndex()
{
$idsParam = Yii::$app->request->get('ids');
$idRange = $this->parseIdRangeFromPath($idsParam);
if ($idRange && !$idRange->isEmpty()) {
$users = UserRepository::findAll($idRange->toArray());
} else {
$users = UserRepository::find()->all();
}
return $this->collection($users);
}
Работа с CQRS (команды и запросы)
Шаблон содержит заготовки для CQRS в core/application/command/, core/application/query/ и core/application/handler/. Рекомендуется следующий подход:
- Определите команду или запрос как DTO (например,
CreateUserCommand). - Создайте соответствующий хендлер в
core/application/handler/. - В контроллере вызовите хендлер через шину команд (можно реализовать через внедрение зависимости или фасад).
Пример:
// core/application/command/CreateUserCommand.php
class CreateUserCommand
{
public string $name;
public string $email;
public string $password;
}
// core/application/handler/CreateUserHandler.php
class CreateUserHandler
{
public function handle(CreateUserCommand $command): User
{
// логика создания пользователя
}
}
// в контроллере
public function actionCreate()
{
$command = new CreateUserCommand();
$command->name = Yii::$app->request->post('name');
$command->email = Yii::$app->request->post('email');
$command->password = Yii::$app->request->post('password');
$user = (new CreateUserHandler())->handle($command);
return $this->item($user);
}
Для более сложных сценариев рекомендуется внедрять шину команд (например, через yii\di\Container или отдельный сервис).
Создание модуля
Модули предназначены для группировки функциональности (например, telegram-bot, admin-portal). Они располагаются в папке modules/.
- Создайте папку
modules/my-module/. - Создайте класс Module (наследник
yii\base\Module). - Зарегистрируйте модуль в
config/modules.php:return [ 'my-module' => [ 'class' => 'modules\my-module\Module', 'controllerNamespace' => 'modules\my-module\presentation\controller', ], ]; - Внутри модуля организуйте ту же структуру (presentation, application, domain, infrastructure), или используйте упрощённую структуру.
Миграции и работа с БД
Миграции располагаются в core/infrastructure/migrations/ или в отдельных модулях. Для применения миграций используйте консольную команду:
php yii migrate
Пространства имён миграций настраиваются в config/migration_namespaces.php. Пример:
return [
'core\\infrastructure\\migrations',
'modules\\my-module\\infrastructure\\migrations',
];
Тестирование
Для тестирования используется Codeception. Конфигурация в codeception.yml. Тесты пишутся в tests/.
Юнит-тесты - для отдельных классов.
Функциональные тесты - для контроллеров и API.
Приёмные тесты - для UI (если используется).
Запуск тестов:
./vendor/bin/codecept run
Работа с окружением
Для локальной разработки можно использовать встроенный сервер Yii:
php yii serve --docroot=web
Или Docker (файл docker-compose.yml):
docker-compose up -d
Внимание: Docker-образ в шаблоне использует PHP 7.4, но проект требует PHP 8.1+. Рекомендуется обновить образ.
Статический анализ и проверка качества
Шаблон включает игнорирование для scancore (ручной статический анализатор) через .scancoreignore. При необходимости добавьте свой инструмент (PHPStan, Psalm) и настройте его.