Yii2. Gii — генерирование кода
27.04.2019
Теги: Web-разработка • Yii2 • Теория • Фреймворк
При создании любого приложения так или иначе приходится писать один и тот же код, который вполне можно охарактеризовать термином «типовой код». Например на сайте есть статьи и новости. Для их выборки и вывода на страницу по сути нужен одинаковый код, который будет отличаться лишь наименованием таблиц БД и полей в них. То же самое касается дальнейшего редактирования, добавления и удаления статей и новостей. Все это аналогичные операции, для которых потребуется типовой код.
Чтобы облегчить эту задачу, современные фреймворки предлагают инструменты для генерирования такого кода. Во фреймворке Yii2 таким инструментом является Gii. Это ничто иное, как модуль, который можно настроить в конфигурации фреймворка, а конкретнее, в файле config\web.php
:
<?php $params = require(__DIR__ . '/params.php'); $config = [ /*...*/ ]; if (YII_ENV_DEV) { // configuration adjustments for 'dev' environment $config['bootstrap'][] = 'debug'; $config['modules']['debug'] = [ 'class' => 'yii\debug\Module', ]; $config['bootstrap'][] = 'gii'; $config['modules']['gii'] = [ 'class' => 'yii\gii\Module', ]; } return $config;
В данной конфигурации устанавливается включение модуля Gii в режиме разработки. Давайте попробует открыть данный модуль. Для этого нам необходимо обратиться по следующему адресу:
http://server.com/gii # если используется ЧПУ http://server.com/index.php?r=gii # если ЧПУ не настроены
Здесь можно выполнить целый ряд операций: создать модель, контроллер и виды (приложение CRUD), можно генерировать формы, модули и расширения. Очень удобный инструмент, который поможет в считанные минуты сгенерировать типовое приложение.
Теперь попробуем этот инструментр в работе. Создадим базу данных catalog
и две таблицы — category
и product
:
CREATE TABLE `category` ( `id` int(10) PRIMARY KEY UNSIGNED NOT NULL COMMENT 'Первичный ключ', `parent_id` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Родительская категория', `name` varchar(100) NOT NULL COMMENT 'Название категории', `sortorder` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Порядок сортировки' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `product` ( `id` int(12) PRIMARY KEY UNSIGNED NOT NULL COMMENT 'Первичный ключ', `category_id` int(10) UNSIGNED DEFAULT '0' COMMENT 'Родительская категория', `name` varchar(200) NOT NULL COMMENT 'Название товара', `sortorder` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Порядок сортировки' ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Для начала создадим модель в блоке Model Generator. Здесь достаточно лишь начать вводить имя таблицы, с которой будет работать данная модель. Yii при начале ввода сразу же подскажет имя возможной таблицы. После этого кликаем по полю Model Class и фреймворк сам подставит нужное имя класса модели — Category
. Остается нажать кнопку Preview и на следующей странице нажать кнопку Generate.
В результате будет создан файл models/Category.php
:
<?php namespace app\models; use Yii; /** * This is the model class for table "category". * * @property int $id Первичный ключ * @property int $parent_id Родительская категория * @property string $name Название категории * @property int $sortorder Порядок сортировки * * @property Product[] $products */ class Category extends \yii\db\ActiveRecord { /** * {@inheritdoc} */ public static function tableName() { return 'category'; } /** * {@inheritdoc} */ public function rules() { return [ [['parent_id', 'sortorder'], 'integer'], [['name'], 'required'], [['name'], 'string', 'max' => 100], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => 'Первичный ключ', 'parent_id' => 'Родительская категория', 'name' => 'Название категории', 'sortorder' => 'Порядок сортировки', ]; } /** * @return \yii\db\ActiveQuery */ public function getProducts() { return $this->hasMany(Product::className(), ['category_id' => 'id']); } }
Теперь перейдем к генерированию CRUD приложения, выбрав в меню пункт CRUD Generator. Здесь укажем класс модели и контроллера, этого пока будет вполне достаточно.
- Model Class:
app\models\Category
- Controller Class:
app\controllers\CategoryController
После этого жмем кнопку Preview и на новой странице кнопку Generate:
Класс контроллера CategoryController
:
<?php namespace app\controllers; use Yii; use app\models\Category; use yii\data\ActiveDataProvider; use yii\web\Controller; use yii\web\NotFoundHttpException; use yii\filters\VerbFilter; /** * CategoryController implements the CRUD actions for Category model. */ class CategoryController extends Controller { /** * {@inheritdoc} */ public function behaviors() { return [ 'verbs' => [ 'class' => VerbFilter::className(), 'actions' => [ 'delete' => ['POST'], ], ], ]; } /** * Lists all Category models. * @return mixed */ public function actionIndex() { $dataProvider = new ActiveDataProvider([ 'query' => Category::find(), ]); return $this->render('index', [ 'dataProvider' => $dataProvider, ]); } /** * Displays a single Category model. * @param integer $id * @return mixed * @throws NotFoundHttpException if the model cannot be found */ public function actionView($id) { return $this->render('view', [ 'model' => $this->findModel($id), ]); } /** * Creates a new Category model. * If creation is successful, the browser will be redirected to the 'view' page. * @return mixed */ public function actionCreate() { $model = new Category(); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); } return $this->render('create', [ 'model' => $model, ]); } /** * Updates an existing Category model. * If update is successful, the browser will be redirected to the 'view' page. * @param integer $id * @return mixed * @throws NotFoundHttpException if the model cannot be found */ public function actionUpdate($id) { $model = $this->findModel($id); if ($model->load(Yii::$app->request->post()) && $model->save()) { return $this->redirect(['view', 'id' => $model->id]); } return $this->render('update', [ 'model' => $model, ]); } /** * Deletes an existing Category model. * If deletion is successful, the browser will be redirected to the 'index' page. * @param integer $id * @return mixed * @throws NotFoundHttpException if the model cannot be found */ public function actionDelete($id) { $this->findModel($id)->delete(); return $this->redirect(['index']); } /** * Finds the Category model based on its primary key value. * If the model is not found, a 404 HTTP exception will be thrown. * @param integer $id * @return Category the loaded model * @throws NotFoundHttpException if the model cannot be found */ protected function findModel($id) { if (($model = Category::findOne($id)) !== null) { return $model; } throw new NotFoundHttpException('The requested page does not exist.'); } }
Теперь наше приложение для работы с категориями каталога будет располагать всем необходимыми функциями для работы CRUD приложения: создание, показ, редактирования и удаление категорий. Конечно, все это придется корректировать под свои нужды, но тем не менее, благодаря генератору за считанные минуты удалось получить рабочее типовое приложение.
Поиск: Web-разработка • Yii2 • Фреймворк