Статьи

Как программировать с Yii2: работа с базой данных и активной записью

Конечный продукт
Что вы будете создавать

Если вы спрашиваете: «Что такое Yii?» Посмотрите мой предыдущий учебник: Введение в Yii Framework , в котором рассматриваются преимущества Yii и представлен обзор того, что нового в Yii 2.0, выпущенном 12 октября 2014 года.

В разделе «Программирование с Yii2: начало работы» мы настроили Yii2 локально, создали приложение Hello World, настроили удаленный сервер и использовали GitHub для развертывания нашего кода. Во второй части мы узнали о реализации Yii его архитектуры Model View Controller и о том, как создавать веб-страницы и формы, которые собирают и проверяют данные. В этом руководстве мы будем использовать возможности базы данных и активной записи Yii для автоматизации генерации кода для базового веб-приложения.

Для этих примеров мы продолжим предполагать, что мы создаем структуру для публикации простых обновлений статуса, например, наш собственный мини-Twitter.

Во-первых, нам нужно создать базу данных в нашей среде разработки. Я делаю это через пользовательский веб-интерфейс MAMP PHPMyAdmin. Перейдите к PHPMyAdmin, например, http: // localhost: 8888 / MAMP / index.php? Page = phpmyadmin , выберите вкладку Базы данных и создайте базу данных с именем hello :

MAMP PHPMyAdmin Создать базу данных

Вы также можете использовать интерфейс командной строки MySQL.

Теперь мы предоставим учетные данные базы данных в файл конфигурации базы данных Yii. Откройте /hello/config/db.php и укажите свои учетные данные базы данных MySQL. Мой выглядит так:

1
2
3
4
5
6
7
8
9
<?php
 
return [
    ‘class’ => ‘yii\db\Connection’,
    ‘dsn’ => ‘mysql:host=localhost;dbname=hello’,
    ‘username’ => ‘root’,
    ‘password’ => ‘password’,
    ‘charset’ => ‘utf8’,
];

Теперь мы создадим нашу первую миграцию базы данных. Миграция предоставляет программный способ создания и обновления схем баз данных. Это особенно полезно, если вы работаете на нескольких серверах или в разных средах. Это устраняет сложность импорта сценариев SQL.

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

Наша первая миграция создаст таблицу состояния. Откройте Терминал и введите следующее:

1
2
cd ~/Sites/hello
./yii migrate/create create_status_table

Это должно выглядеть так, когда вы закончите:

Yii Миграция Создать

Когда вы откроете \hello\migrations , вы увидите файл с именем, похожим на m141201_013120_create_status_table.php . Это должно выглядеть так при открытии:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
<?php
 
use yii\db\Schema;
use yii\db\Migration;
 
class m141201_013120_create_status_table extends Migration
{
    public function up()
    {
 
    }
 
    public function down()
    {
        echo «m141201_013120_create_status_table cannot be reverted.\n»;
 
        return false;
    }
}

Это код миграции по умолчанию, который предоставляет Yii. Далее мы обновим его, предоставив необходимые нам поля.

Наша таблица состояния будет хранить текст сообщения и указывать, является ли сообщение личным или общедоступным. Каждая строка также будет иметь идентификатор, создавать и обновлять поля времени.

Обновите ваш код миграции на наш:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
public function up()
   {
         $tableOptions = null;
         if ($this->db->driverName === ‘mysql’) {
             $tableOptions = ‘CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB’;
         }
 
         $this->createTable(‘{{%status}}’, [
             ‘id’ => Schema::TYPE_PK,
             ‘message’ => Schema::TYPE_TEXT.’
             ‘permissions’ => Schema::TYPE_SMALLINT .
             ‘created_at’ => Schema::TYPE_INTEGER .
             ‘updated_at’ => Schema::TYPE_INTEGER .
         ], $tableOptions);
     }
 
 
   public function down()
   {
     $this->dropTable(‘{{%status}}’);
   }

Обратите внимание, как мы добавили определения для нужных нам полей, таких как message , permissions , created_at и updated_at .

Чтобы сообщить Yii о создании таблицы, нам нужно запустить миграцию. Это просто. Из терминала снова запускаем ./yii migrate/up :

01
02
03
04
05
06
07
08
09
10
11
12
13
$ ./yii migrate/up
Yii Migration Tool (based on Yii v2.0.0)
 
Total 1 new migration to be applied:
    m141201_013120_create_status_table
 
Apply the above migration?
*** applying m141201_013120_create_status_table
    > create table {{%status}} … done (time: 0.032s)
*** applied m141201_013120_create_status_table (time: 0.038s)
 
 
Migrated up successfully.

Если вы просматриваете таблицу с помощью PHPMyAdmin, вы должны увидеть что-то вроде этого:

PHPMyAdmin Просмотр таблицы состояния

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

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

С Gii мы начинаем с построения модели на основе каждой таблицы базы данных, которую мы создали. Для нашего примера мы будем использовать таблицу Status.

Чтобы начать использовать Gii, перейдите в свое веб-приложение и добавьте /gii , например, http: // localhost: 8888 / hello / web / gii . Вы увидите что-то вроде этого:

Yiis Gii Генератор строительных лесов

Нажмите « Генератор моделей» и введите status в поле « Имя таблицы» :

Gii Model Generator

Когда вы нажмете Preview , он покажет вам, какие файлы он будет создавать. Поскольку у нас уже есть файл модели Status.php из последнего урока, нажмите Перезаписать . Затем нажмите « Создать» .

Gii Model Generator Предварительный просмотр

Результаты будут выглядеть так:

Сгенерирован код модели Gii

Откройте файл /hello/models/Status.php и вы увидите основные правила проверки и атрибуты форм, которые Yii создал для нас:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
 
namespace app\models;
 
use Yii;
 
/**
 * This is the model class for table «status».
 *
 * @property integer $id
 * @property string $message
 * @property integer $permissions
 * @property integer $created_at
 * @property integer $updated_at
 */
class Status extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return ‘status’;
    }
 
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [[‘message’, ‘created_at’, ‘updated_at’], ‘required’],
            [[‘message’], ‘string’],
            [[‘permissions’, ‘created_at’, ‘updated_at’], ‘integer’]
        ];
    }
 
    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            ‘id’ => ‘ID’,
            ‘message’ => ‘Message’,
            ‘permissions’ => ‘Permissions’,
            ‘created_at’ => ‘Created At’,
            ‘updated_at’ => ‘Updated At’,
        ];
    }
}

Теперь пришло время использовать Gii для построения контроллера и просмотра таблицы состояния. Вернитесь на домашнюю страницу Gii и нажмите CRUD Generator , например, http: // localhost: 8888 / hello / web / gii / crud :

Для класса модели введите app\models\Status (эти записи чувствительны к регистру). Для поиска класса модели введите app\models\StatusSearch . Для класса контроллеров введите app\controllers\StatusController . Это должно выглядеть так:

Yiis Gii CRUD Генератор

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

Yiis Gii CRUD Generator Предварительный просмотр

Когда вы нажмете « Создать» , вы увидите все контроллеры и увидите созданные файлы:

Yiis Gii CRUD сгенерированный код

Перейдите в браузере по адресу http: // localhost: 8888 / hello / web / status , и вы увидите созданную страницу индекса CRUD. Поскольку в базе данных еще нет ни одной строки, она будет выглядеть пустой.

Yiis Gii CRUD Генерируемая индексная сетка

Теперь нажмите на Create Status, и вы увидите стандартную форму Create Status, которую создал Gii:

Yii Форма по умолчанию для таблицы состояния

Удивительно, как быстро Gii создает для нас рабочий код. Далее мы настроим код скаффолдинга, чтобы сделать эту работу за нас.

Давайте очистим форму. В /hello/views/Status/_form.php удалите созданные и обновленные поля:

1
2
<?= $form->field($model, ‘created_at’)->textInput() ?>
   <?= $form->field($model, ‘updated_at’)->textInput() ?>

Замените поле прав доступа кодом раскрывающегося списка, который мы создали во второй части этой серии:

1
2
3
<?=
   $form->field($model, ‘permissions’)->dropDownList($model->getPermissions(),
            [‘prompt’=>’- Choose Your Permissions -‘]) ?>

Нам также необходимо getPermissions функцию getPermissions в модель. Отредактируйте /hello/models/Status.php . Верните константные определения и функции прав доступа:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
const PERMISSIONS_PRIVATE = 10;
      const PERMISSIONS_PUBLIC = 20;
 
public function getPermissions() {
      return array (self::PERMISSIONS_PRIVATE=>’Private’,self::PERMISSIONS_PUBLIC=>’Public’);
    }
     
    public function getPermissionsLabel($permissions) {
      if ($permissions==self::PERMISSIONS_PUBLIC) {
        return ‘Public’;
      } else {
        return ‘Private’;
      }
    }

Ваша новая форма статуса должна выглядеть следующим образом:

Пересмотренный статус Создать форму

Нам нужно немного настроить контроллер, чтобы правильно сохранить форму.

В /hello/controllers/StatusController.php замените метод actionCreate следующим кодом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public function actionCreate()
   {
       $model = new Status();
 
       if ($model->load(Yii::$app->request->post())) {
         $model->created_at = time();
         $model->updated_at = time();
          if ($model->save()) {
            return $this->redirect([‘view’, ‘id’ => $model->id]);
          }
       }
       return $this->render(‘create’, [
           ‘model’ => $model,
       ]);
   }

Когда форма публикуется, мы вручную устанавливаем поля created_at и updated_at , затем сохраняем данные в базе данных.

При сохранении первого обновления статуса вы увидите следующую страницу просмотра:

Просмотр состояния по умолчанию

Давайте перенастроим панель навигации, чтобы она не выпадала в статусе, а сразу переходила на страницу индекса статуса. Отредактируйте /hello/views/layouts/main.php и замените код Nav::widget следующим:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
echo Nav::widget([
               ‘options’ => [‘class’ => ‘navbar-nav navbar-right’],
               ‘items’ => [
                   [‘label’ => ‘Home’, ‘url’ => [‘/site/index’]],
                   [‘label’ => ‘Status’, ‘url’ => [‘/status/index’]],
                   [‘label’ => ‘About’, ‘url’ => [‘/site/about’]],
                   [‘label’ => ‘Contact’, ‘url’ => [‘/site/contact’]],
                   Yii::$app->user->isGuest ?
                       [‘label’ => ‘Login’, ‘url’ => [‘/site/login’]] :
                       [‘label’ => ‘Logout (‘ . Yii::$app->user->identity->username . ‘)’,
                           ‘url’ => [‘/site/logout’],
                           ‘linkOptions’ => [‘data-method’ => ‘post’]],
               ],
           ]);

Когда вы вернетесь к представлению «Индекс состояния», вы увидите таблицу Yii2, заполненную данными:

Сетка по умолчанию с данными

Код, который генерирует эту страницу, находится в /hello/views/status/index.php :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
 
use yii\helpers\Html;
use yii\grid\GridView;
 
/* @var $this yii\web\View */
/* @var $searchModel app\models\StatusSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */
 
$this->title = ‘Statuses’;
$this->params[‘breadcrumbs’][] = $this->title;
?>
<div class=»status-index»>
 
    <h1><?= Html::encode($this->title) ?></h1>
    <?php // echo $this->render(‘_search’, [‘model’ => $searchModel]);
 
    <p>
        <?= Html::a(‘Create Status’, [‘create’], [‘class’ => ‘btn btn-success’]) ?>
    </p>
 
    <?= GridView::widget([
        ‘dataProvider’ => $dataProvider,
        ‘filterModel’ => $searchModel,
        ‘columns’ => [
            [‘class’ => ‘yii\grid\SerialColumn’],
 
            ‘id’,
            ‘message:ntext’,
            ‘permissions’,
            ‘created_at’,
            ‘updated_at’,
 
            [‘class’ => ‘yii\grid\ActionColumn’],
        ],
    ]);
 
</div>

Если вы попробуете сортировать столбцы и просмотреть, обновить и удалить значки, вы увидите, что Gii также разработала все функции для этих функций.

Таким образом, всего за несколько минут мы создали схему для нашей базы данных и сгенерировали модель и весь код веб-приложения, необходимый для базового приложения. Надеюсь, вы нашли возможности генерации кода Yii такими же впечатляющими, как и я.

Далее я покажу вам, как интегрировать возможности регистрации и входа пользователей в наше приложение, чтобы мы могли установить отношения соединения между статусными сообщениями и конкретными пользователями.

Если вы хотите узнать, когда появится следующий учебник по Yii2, следуйте за мной @reifman в Твиттере или зайдите на страницу инструктора Tuts + . Моя страница инструктора будет включать все статьи из этой серии, как только они будут опубликованы.