Разработка админки — это как ремонт в квартире: вроде бы и не видно, а без нее никак. Но если подойти без плана, получится темный подвал с кучей проводов. В этой статье я расскажу, как сделать административную панель на Yii2 так, чтобы и вам было удобно, и пользователи не ругались. Без лишней воды, только практика.
С чего начать: структура панели
Первое, что нужно понять — админка не должна быть монолитом. Не надо пихать все в один контроллер. Лучше выделить отдельный модуль. В Yii2 это делается просто: создаете папку `modules/admin` и регистрируете модуль в конфиге.
Вот как выглядит типичная структура:
// common/config/main.php
'modules' => [
'admin' => [
'class' => 'common\modules\admin\Module',
'layout' => 'main', // свой layout для админки
'as access' => [
'class' => 'yii\filters\AccessControl',
'rules' => [
[
'allow' => true,
'roles' => ['@'], // только авторизованные
],
],
],
],
],
Внутри модуля уже создаете контроллеры, модели, представления — как в обычном приложении. Такой подход позволяет держать админку отдельно от фронта, не смешивая логику.
Не забудьте про наследование. Базовый контроллер админки должен быть один, чтобы задать общие правила — проверку прав, обработку ошибок, настройку темы.
Строим каркас: базовый контроллер и виджеты
Создаем базовый контроллер `AdminController`, который будет родителем для всех остальных. В нем определяем поведение доступа, проверку ролей и общий экшен для ошибок.
// modules/admin/controllers/AdminController.php
namespace common\modules\admin\controllers;
use Yii;
use yii\web\Controller;
class AdminController extends Controller
{
public function behaviors()
{
return [
'access' => [
'class' => 'yii\filters\AccessControl',
'rules' => [
[
'allow' => true,
'roles' => ['admin'], // только роль admin
],
],
],
];
}
public function actionError()
{
$exception = Yii::$app->errorHandler->exception;
return $this->render('error', ['exception' => $exception]);
}
}
Для ускорения разработки используйте виджеты. Например, `GridView` — это таблица с сортировкой, фильтрами и пагинацией. Выглядит мощно, а кода мало.
// modules/admin/views/user/index.php
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
'id',
'username',
'email',
[
'attribute' => 'status',
'value' => function ($model) {
return $model->status == 1 ? 'Активен' : 'Заблокирован';
},
],
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
Не забывайте про `ActiveForm` — он сам генерирует поля, валидацию, ошибки. Экономит часы.
Работа с формами и валидацией
Формы — это сердце админки. Через них вы добавляете и редактируете данные. В Yii2 есть `ActiveForm`, который связывает модель и поля. Важно правильно настроить правила валидации в модели — тогда на фронте все будет проверяться автоматически.
// common/models/User.php
public function rules()
{
return [
[['username', 'email'], 'required'],
[['email'], 'email'],
[['username'], 'string', 'min' => 3, 'max' => 255],
[['status'], 'in', 'range' => [0, 1]],
];
}
В представлении форма выглядит так:
// modules/admin/views/user/_form.php
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'username') ?>
<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'status')->dropDownList([0 => 'Заблокирован', 1 => 'Активен']) ?>
<div class="form-group">
<?= Html::submitButton('Сохранить', ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
Совет: не пишите логику в контроллере. Вся бизнес-логика должна быть в моделях или сервисах. Такой код легче тестировать и поддерживать.
Безопасность и доступы
Админка — лакомый кусок для злоумышленников. Поэтому безопасность должна быть на высоте. В Yii2 есть встроенные механизмы: RBAC (управление ролями), фильтры доступа, защита от CSRF.
Вот как настроить RBAC в простом виде: создаете роли, назначаете их пользователям, а в контроллерах проверяете разрешения.
// console/controllers/RbacController.php
public function actionInit()
{
$auth = Yii::$app->authManager;
$admin = $auth->createRole('admin');
$auth->add($admin);
$manager = $auth->createRole('manager');
$auth->add($manager);
$auth->addChild($admin, $manager); // admin наследует права manager
}
В контроллере проверяем право на действие:
public function actionDelete($id)
{
if (!Yii::$app->user->can('deleteUser')) {
throw new ForbiddenHttpException('Недостаточно прав');
}
// ... удаление
}
Не забывайте про CSRF-защиту: в Yii2 она включена по умолчанию, просто не отключайте ее без нужды.
Ускоряем разработку: генераторы и расширения
Gii — это встроенный генератор кода. Он создает модели, контроллеры, представления и даже CRUD-операции. Запускаете Gii, указываете таблицу — и получаете готовый код. Потом его можно подправить под свои нужды.
Для админки часто используют расширения. Например, `kartik-v/yii2-grid` — это улучшенная версия GridView с экспортом в Excel, фильтрами и кучей настроек. Или `2amigos/yii2-date-picker-widget` для выбора дат.
Вот пример установки расширения через Composer:
composer require kartik-v/yii2-grid "@dev"
И использование в представлении:
use kartik\grid\GridView;
echo GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
'id',
'name',
['class' => 'kartik\grid\ActionColumn'],
],
'export' => true,
'responsive' => true,
]);
Но не злоупотребляйте расширениями. Чем меньше зависимостей — тем проще поддерживать проект.
Оптимизация и кэширование
Админка должна работать быстро, иначе сотрудники будут страдать. Используйте кэширование для данных, которые редко меняются. Например, список категорий или настройки.
$categories = Yii::$app->cache->getOrSet('categories', function () {
return Category::find()->all();
}, 3600); // кэш на час
Также следите за запросами к базе. Используйте `with()` для жадной загрузки связей, чтобы не было N+1 запросов.
$users = User::find()->with('profile')->all(); // один запрос вместо сотни
И не забывайте про индексы в базе. Если таблица большая, а фильтры работают медленно — добавьте индекс на соответствующие поля.
Практические советы и частые ошибки
- Не храните логику в представлениях. Представление — только вывод данных.
- Используйте миграции для изменения БД. Это упрощает развертывание на продакшене.
- Разделяйте админку и фронт. Не смешивайте стили и скрипты, лучше отдельные ассеты.
- Проверяйте права на каждый экшен. Не надейтесь, что авторизации достаточно.
- Не забывайте про логирование действий админа. Это поможет при разборе инцидентов.
Частая ошибка — использование одного контроллера для всего. Разбивайте на модули: пользователи, заказы, товары и т.д. Это упростит навигацию и поддержку.
Итог
Создание админки на Yii2 — это не ракетостроение. Главное — правильно организовать структуру, использовать встроенные инструменты и не забывать про безопасность. Следуйте советам из статьи, и ваша админка будет удобной и надежной.
В итоге вы получите панель, которая не развалится при первой же нагрузке и не вызовет желания выбросить компьютер в окно. Помните: хорошая админка — это та, которая не мешает работать.


