Разработка админки — это как ремонт в квартире: вроде бы и не видно, а без нее никак. Но если подойти без плана, получится темный подвал с кучей проводов. В этой статье я расскажу, как сделать административную панель на Yii2 так, чтобы и вам было удобно, и пользователи не ругались. Без лишней воды, только практика.

Digital-студия WNDER

С чего начать: структура панели

Первое, что нужно понять — админка не должна быть монолитом. Не надо пихать все в один контроллер. Лучше выделить отдельный модуль. В 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,
]);

Но не злоупотребляйте расширениями. Чем меньше зависимостей — тем проще поддерживать проект.

Лайфхак: Перед тем как ставить расширение, проверьте, не реализует ли это стандартный Yii2. Часто стандартного функционала достаточно, а лишние пакеты только замедляют приложение.

Оптимизация и кэширование

Админка должна работать быстро, иначе сотрудники будут страдать. Используйте кэширование для данных, которые редко меняются. Например, список категорий или настройки.


$categories = Yii::$app->cache->getOrSet('categories', function () {
    return Category::find()->all();
}, 3600); // кэш на час

Также следите за запросами к базе. Используйте `with()` для жадной загрузки связей, чтобы не было N+1 запросов.


$users = User::find()->with('profile')->all(); // один запрос вместо сотни

И не забывайте про индексы в базе. Если таблица большая, а фильтры работают медленно — добавьте индекс на соответствующие поля.

Практические советы и частые ошибки

  • Не храните логику в представлениях. Представление — только вывод данных.
  • Используйте миграции для изменения БД. Это упрощает развертывание на продакшене.
  • Разделяйте админку и фронт. Не смешивайте стили и скрипты, лучше отдельные ассеты.
  • Проверяйте права на каждый экшен. Не надейтесь, что авторизации достаточно.
  • Не забывайте про логирование действий админа. Это поможет при разборе инцидентов.

Частая ошибка — использование одного контроллера для всего. Разбивайте на модули: пользователи, заказы, товары и т.д. Это упростит навигацию и поддержку.

Итог

Создание админки на Yii2 — это не ракетостроение. Главное — правильно организовать структуру, использовать встроенные инструменты и не забывать про безопасность. Следуйте советам из статьи, и ваша админка будет удобной и надежной.

В итоге вы получите панель, которая не развалится при первой же нагрузке и не вызовет желания выбросить компьютер в окно. Помните: хорошая админка — это та, которая не мешает работать.

Студия WNDER