Урок 5: Генерация кода с Gii на Yii 2. Модели, CRUD, безопасность

На 5-ом уроке мы изучим в один из инструментов Yii 2, это Gii. Если раньше вы писали модели, контроллеры и CRUD-операции вручную, то после этого урока  забудите, что это такое. Gii ускорит твою разработку в разы, но важно использовать его правильно.

Gii это генератор кода, встроенный в Yii 2. Он создаёт шаблонный код для моделей, контроллеров, форм, модулей и даже целых CRUD-интерфейсов. Представь, что вместо часов рутинной работы тебе нужно лишь заполнить несколько полей в веб-интерфейсе и код готов.

Как включить Gii?

  1. Открой файл конфигурации config/web.php.
  2. Убедись, что в секции modules есть следующий код (обычно он добавлен по умолчанию в dev-окружении):
php
'modules' => [
    'gii' => [
        'class' => 'yii\gii\Module',
        'allowedIPs' => ['127.0.0.1', '::1'], // Доступ только с локального IP
    ],
],
  1. Перейди по адресу http://ваш-сайт/gii. Если видишь страницу с выбором генераторов, то всё готово!

Важно! Gii должен быть активен только в development-окружении (на локальной машине). Никогда не оставляй его включённым на продакшене это угроза безопасности!

Генерация моделей

Модели в Yii 2 связаны с таблицами базы данных. Gii умеет автоматически создавать классы моделей, анализируя структуру таблиц.

Пошаговый пример:

  1. В интерфейсе Gii выберите Model Generator.
  2. Укажите:
    • Table Name: user (название вашей таблицы).
    • Model Class: User (имя класса модели).
  3. Нажмите Preview, затем Generate.

Gii создаст файл models/User.php:

php
namespace app\models;

use yii\db\ActiveRecord;

class User extends ActiveRecord
{
    public static function tableName()
    {
        return 'user';
    }

    public function rules()
    {
        return [
            [['username', 'email'], 'required'],
            [['created_at'], 'safe'],
            [['username'], 'string', 'max' => 50],
            [['email'], 'email'],
        ];
    }
}

Что делает этот код?

  • Наследуется от ActiveRecord для работы с БД.
  • Метод tableName() указывает на таблицу.
  • rules() задаёт правила валидации для полей.

Генерация контроллеров и CRUD

CRUD (Create, Read, Update, Delete) стандартные операции для работы с данными. Gii генерирует за тебя:

  • Контроллер с экшенами (actions).
  • Views: формы создания/редактирования, список записей, просмотр деталей.

Генерация CRUD:

  1. В Gii выберите CRUD Generator.
  2. Заполните поля:
    • Model Class: app\models\User.
    • Controller Class: app\controllers\UserController.
  3. Нажмите Generate.

Gii создаст:

  • Контроллер UserController.php с методами actionIndex()actionCreate() и т.д.
  • Views в папке views/user/index.php_form.phpview.php.

Пример контроллера:

php
namespace app\controllers;

use app\models\User;
use yii\web\Controller;
use yii\data\ActiveDataProvider;

class UserController extends Controller
{
    public function actionIndex()
    {
        $dataProvider = new ActiveDataProvider([
            'query' => User::find(),
        ]);

        return $this->render('index', [
            'dataProvider' => $dataProvider,
        ]);
    }

    // Другие экшены: create, update, delete...
}

Модификация сгенерированного кода

Сгенерированный код это основа. Подстроим его под свои нужды.

1. Добавим проверку доступа в контроллер:

Изменим UserController, добавив поведение AccessControl:

php
use yii\filters\AccessControl;

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::class,
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['@'], // Только авторизованные пользователи
                ],
            ],
        ],
    ];
}

2. Расширим модель User:

Добавим метод для получения полного имени пользователя:

php
class User extends ActiveRecord
{
    // ...

    public function getFullName()
    {
        return $this->first_name . ' ' . $this->last_name;
    }
}

3. Изменим вьюху index.php:

Выведем полное имя вместо логина:

php
// Было:
echo $dataProvider->models[0]->username;

// Стало:
echo $dataProvider->models[0]->fullName;

Меры безопасности при использовании Gii

  1. Никогда не включайте Gii на продакшене.
  2. Ограничьте IP-адреса в конфиге:
php
'allowedIPs' => ['127.0.0.1'], // Только локальный доступ
  1. Используйте .htaccess или nginx-настройки для защиты папки gii.
  2. Всегда проверяйте входные данные в сгенерированных формах. Например, в модели:
php
public function rules()
{
    return [
        [['email'], 'email'], // Валидация email
        [['role'], 'in', 'range' => ['admin', 'user']], // Разрешённые значения
    ];
}

Практические задачи

  1. Создайте модель для таблицы post:
    • Поля: idtitlecontentauthor_idcreated_at.
    • Добавьте правило валидации: title не длиннее 200 символов.
  2. Сгенерируйте CRUD для модели Post:
    • Измените вьюху index.php, чтобы выводились только посты текущего пользователя.
  3. Добавьте кастомное поле в форму создания поста:
    • Поле tags (теги через запятую). Реализуйте его сохранение в БД.

Пример решения задачи 3:

В модели Post:

php
public $tags; // Виртуальное свойство

public function rules()
{
    return [
        [['tags'], 'safe'],
    ];
}

// После сохранения поста:
public function afterSave($insert, $changedAttributes)
{
    parent::afterSave($insert, $changedAttributes);
    // Логика сохранения тегов...
}

Теперь вы умеете использовать Gii для автоматической генерации кода и настраивать его под свои задачи. Всегда дорабатывайте код, добавляйте валидацию и безопасность.

Полный курс с уроками по Yii 2 для начинающих: https://max-gabov.ru/yii-2-dlya-nachinaushih

Поделиться статьей:
Поддержать автора блога

Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.

Персональные рекомендации
Оставить комментарий