Yii2 behaviors. Часть 3

Yii2 behaviors

От автора: приветствую вас, друзья. Мы продолжаем цикл статей, посвященных знакомству с фреймворком Yii2. В этой статье мы продолжим знакомиться с темой поведений фреймворка — Yii2 behaviors, благодаря которым мы можем расширять функциональность нашего кода.

Итак, в двух предыдущих статьях мы познакомились с понятием поведений в Yii и использовали в работе готовое поведение TimestampBehavior, благодаря которому для статей назначаются дата и время их создания или изменения без нашего участия, т.е. автоматически. Это очень удобно.

Кроме этого поведения Yii предлагает еще несколько готовых к использованию поведений, например, SluggableBehavior, AttributeBehavior и прочие. Также Yii позволяет создавать и собственные поведения – эта тема нас и интересует в рамках текущей статьи.

Для того, чтобы реализовать поведение, необходимо создать класс, расширяющий базовый класс yii\base\Behavior. Создадим в корне папку components и в ней исковый класс:

namespace app\components;

use yii\base\Behavior;

class TestBehavior extends Behavior{

}

Yii2 behaviors

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

Далее добавим в класс создаваемого behavior следующий код:

class TestBehavior extends Behavior{

    public $title = 'title';

    public function events(){
        return [
            ActiveRecord::EVENT_BEFORE_VALIDATE => 'changeTitle',
        ];
    }

    public function changeTitle($event){
        echo '<pre>';
        var_dump($event);
        die;
    }

}

Давайте разберем его. Поведение имеет одно свойство, которое мы назвали $title. Назвать его можно как угодно, это не столь важно. Более важно здесь значение по умолчанию. Это значение соответствует атрибуту модели. Поскольку мы хотим работать с наименованиями материалов, значением по умолчанию я выбрал title, поскольку привык использовать именно его. Соответственно, если поле модели называется именно так, тогда пользователь при конфигурации поведения может не указывать наименование атрибута. Если же наименование отличается, тогда пользователь его переопределит при прикреплении behavior.

Далее идет некий метод events. Данный метод мы должны переопределить, если наше поведение должно реагировать на некоторые события. В примере выше наше поведение будет реагировать на событие beforeValidate. Для этого события мы назначаем метод changeTitle, каковой и описываем ниже. В качестве параметра метод принимает объект события. В методе мы распечатаем его на экран и завершим дальнейшее выполнение программы. Давайте взглянем на него. Для этого попробуем добавить еще одну новость. Но перед этим прикрепим поведение к модели. Там у нас уже используется поведение TimestampBehavior, просто допишем еще свое:

public function behaviors(){
    return [
        [
            'class' => TimestampBehavior::className(),
            'attributes' => [
                ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
                ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
            ],
            // если вместо метки времени UNIX используется datetime:
            'value' => new Expression('NOW()'),
        ],
        [
            'class' => TestBehavior::className(),
            'title' => 'title',
        ],
    ];
}

Ну а теперь пробуем добавить новость.

Yii2 behaviors

На скриншоте я выделил интересующую нас часть объекта, в элементе title находится название новости, которую я пытаюсь добавить. Чтобы получить непосредственный доступ к нему, нужно обратиться следующим образом: $this->owner->{$this->title}, где $this->title – интересующее нас свойство. Если бы, к примеру, был бы еще текст новости, который записывается в свойство модели content, то к нему мы бы обратились так: $this->owner->{$this->content}.

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

public function changeTitle($event){
    $this->owner->{$this->title} = mb_strtoupper($this->owner->{$this->title}, 'UTF-8');
}

И попробуем еще раз добавить новость, печатая ее название в нижнем регистре.

Yii2 behaviors

Пробуем сохранить и наслаждаемся результатом:

Yii2 behaviors

Отлично! У нас все получилось. Это, конечно, простейший пример создания собственных поведений в Yii, но нас ведь никто не ограничивает :)

Больше о фреймворке вы можете узнать из наших бесплатных или платных уроков. Также создание простейшего блога на Yii2 можно посмотреть в этом цикле уроков.

Самые свежие новости IT и веб-разработки на нашем Telegram-канале

Фреймворк YII2. Быстрая разработка с современным фреймворком

Узнай тонкости современной веб-разработки с помощью фреймворка YII2

Научиться

Метки:

Комментарии Вконтакте:

Комментарии Facebook:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree