Статьи

Как программировать с Yii2: медленное поведение

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

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

В этой серии «Программирование с Yii2» я расскажу читателям, как использовать обновленную версию Yii2 Framework для PHP. В этом уроке я собираюсь показать вам, как изменить маршруты URL-адресов представления Yii по умолчанию для объектов модели, чтобы они были более удобными для пользователя и удобными для поисковых систем. Yii предоставляет встроенную поддержку для этого через его медлительное поведение.

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

Просто напоминание, я участвую в комментариях ниже. Мне особенно интересно, если у вас есть другие подходы, дополнительные идеи или вы хотите предложить темы для будущих уроков.

Википедия также известна как семантический URL-адрес : «… слаг [это часть URL-адреса, которая идентифицирует страницу с использованием понятных человеку ключевых слов». Например, URL Yii по умолчанию для страницы нашего представления статуса ниже:

http://localhost:8888/hello/status/view?id=3

Просмотр статуса по идентификатору - без слаг

Этот URL ничего не говорит пользователю или поисковым системам о его содержании. Реализуя слагов, мы можем получить доступ к странице с помощью URL-адреса, такого как:

http://localhost:8888/hello/status/looking-forward-to-the-super-bowl

Yii2 упрощает создание слагов, как никогда, используя его поведение ActiveRecord — в частности, SluggableBehavior .

Чтобы добавить поддержку slug в наше приложение Hello, мы начнем с создания миграции ActiveRecord, чтобы добавить столбец slug в нашу таблицу Status.

1
2
3
4
5
./yii migrate/create extend_status_table_for_slugs
Yii Migration Tool (based on Yii v2.0.1)
 
Create new migration ‘/Users/Jeff/Sites/hello/migrations/m150128_214906_extend_status_table_for_slugs.php’?
New migration created successfully.

Вот миграция, которую вы должны использовать:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
<?php
 
use yii\db\Schema;
use yii\db\Migration;
 
class m150128_214906_extend_status_table_for_slugs extends Migration
{
    public function up()
    {
      $tableOptions = null;
      if ($this->db->driverName === ‘mysql’) {
          $tableOptions = ‘CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB’;
      }
      $this->addColumn(‘{{%status}}’,’slug’,Schema::TYPE_STRING.’ NOT NULL’);
    }
 
    public function down()
    {
      $this->dropColumn(‘{{%status}}’,’slug’);
    }
}

Затем примените миграцию:

01
02
03
04
05
06
07
08
09
10
11
12
./yii migrate/up
Yii Migration Tool (based on Yii v2.0.1)
 
Total 1 new migration to be applied:
    m150128_214906_extend_status_table_for_slugs
 
Apply the above migration?
*** applying m150128_214906_extend_status_table_for_slugs
    > add column slug string NOT NULL to table {{%status}} … done (time: 0.022s)
*** applied m150128_214906_extend_status_table_for_slugs (time: 0.027s)
 
Migrated up successfully.

Далее мы добавляем медленное поведение в модель apps\models\Status.php :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
 
namespace app\models;
 
use Yii;
use yii\behaviors\SluggableBehavior;
 …
 class Status extends \yii\db\ActiveRecord
{
      const PERMISSIONS_PRIVATE = 10;
      const PERMISSIONS_PUBLIC = 20;
   
    public function behaviors()
    {
        return [
            [
                ‘class’ => SluggableBehavior::className(),
                ‘attribute’ => ‘message’,
                // ‘slugAttribute’ => ‘slug’,
            ],
        ];
    }

slugAttribute не нужен, так как наш столбец называется slug , фреймворк по умолчанию.

Давайте проверим эту функциональность, создав новый элемент статуса. В меню « Состояние» нажмите « Создать» :

Создать статус теста вялого поведения

Используя PHPMyAdmin, я посмотрю на таблицу Status и увижу, что поле slug автоматически заполняется введенной мной версией URL сообщения Status.

Атрибут Slug автоматически заполняется SluggableBehavior

Но вы можете заметить, что URL страницы просмотра продолжает идентифицировать сообщение по его числовому идентификатору:

http://localhost:8888/hello/status/view?id=4

Как мы можем изменить это?

В app\views\status\index.php нам нужно обновить вид сетки с помощью пользовательской ссылки. Эта ссылка будет кодировать правильный URL для нашего пуля в представлении:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<?= GridView::widget([
       ‘dataProvider’ => $dataProvider,
       ‘filterModel’ => $searchModel,
       ‘columns’ => [
           [‘class’ => ‘yii\grid\SerialColumn’],
           ‘id’,
           ‘message:ntext’,
           ‘permissions’,
           ‘created_at’,
           ‘updated_at’,
                 [‘class’ => ‘yii\grid\ActionColumn’,
                     ‘template’=>'{view} {update} {delete}’,
                       ‘buttons’=>[
               ‘view’ => function ($url, $model) {
                 return Html::a(‘<span class=»glyphicon glyphicon-eye-open»>
                             }
                           ],
                 ],
       ],
   ]);

Теперь, когда вы заходите на страницу указателя, вы увидите, что ссылка для просмотра преобразуется в:

http://localhost:8888/hello/status/test-the-slug-attribute

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

Yii анализирует входящие запросы, используя набор правил по умолчанию, встроенный в его UrlManager . Нам нужно добавить поддержку нашего пользовательского маршрута slug в приложение app\config\web.php :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
‘components’ => [
     ‘urlManager’ => [
             ‘showScriptName’ => false,
             ‘enablePrettyUrl’ => true,
             ‘rules’ => [
                 ‘status’ => ‘status/index’,
                 ‘status/index’ => ‘status/index’,
                 ‘status/create’ => ‘status/create’,
                 ‘status/view/<id:\d+>’ => ‘status/view’,
                 ‘status/update/<id:\d+>’ => ‘status/update’,
                 ‘status/delete/<id:\d+>’ => ‘status/delete’,
                 ‘status/<slug>’ => ‘status/slug’,
                       ‘defaultRoute’ => ‘/site/index’,
             ],

Теперь, когда URL-адрес приходит в http: // localhost: 8888 / hello / status / test-the-slug-attribute , Yii направляет запрос в действие slug StatusController с параметром <slug> или в этом случае «test- -слизняк-атрибут».

Обратите внимание, что мы также определили status/index и status/create специально в маршруте, иначе Yii может подумать, что «индекс» или «создать» были слагами.

Затем мы добавляем новое действие контроллера под названием slug в StatusController.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
/**
    * Displays a single Status model.
    * @param integer $id
    * @return mixed
    */
   public function actionView($id)
   {
       return $this->render(‘view’, [
           ‘model’ => $this->findModel($id),
       ]);
   }
    
   /**
    * Displays a single Status model.
    * @param string $slug
    * @return mixed
    */
   public function actionSlug($slug)
   {
     $model = Status::find()->where([‘slug’=>$slug])->one();
     if (!is_null($model)) {
         return $this->render(‘view’, [
             ‘model’ => $model,
         ]);
     } else {
       return $this->redirect(‘/status/index’);
     }
   }

Теперь, когда вы заходите на страницу, используя свой URL-адрес, вы должны увидеть это:

Доступ к странице состояния через слаг

Yii предлагает несколько приятных улучшений SluggableBehavior для полезных сценариев.

Например, когда поисковая система записывает слаг, вы, вероятно, не хотите, чтобы URL страницы изменялся. Атрибут ‘immutable’ говорит Yii, чтобы он оставался неизменным после его первого создания, даже если сообщение обновляется.

Если пользователи вводят сообщения, которые пересекаются в содержимом, свойство ‘sureUnique’ автоматически добавляет уникальный суффикс к дубликатам. Это гарантирует, что каждое сообщение имеет уникальный URL, даже если оно идентично.

01
02
03
04
05
06
07
08
09
10
11
public function behaviors()
   {
       return [
           [
               ‘class’ => SluggableBehavior::className(),
               ‘attribute’ => ‘message’,
               ‘immutable’ => true,
               ‘ensureUnique’=>true,
           ],
       ];
   }

Если вы создадите еще одно сообщение с точно таким же содержимым, вы увидите, что его слаг увеличивается до test-the-slug-attribute-2 .

Примечание. Если вы получили ошибку, связанную с неизменным свойством, возможно, вам нужно запустить обновление композитора, чтобы получить последнюю версию Yii.

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

Я приветствую тематические и тематические запросы. Вы можете опубликовать их в комментариях ниже или написать мне по электронной почте на моем сайте Lookahead Consulting .

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