Поведения (behaviors)

Поведения

Оригинал: русскоязычная документация по yii2. Сжато.

Поведения (behaviors) в yii2 — экземпляры класса yii\base\Behavior. Поведения (примеси) дополняют компоненты приложения без перенаследования. Методы и свойства поведения «внедряются» в компонент, и становятся доступными так же, как если бы они были объявлены в классе компонента. Поведение может реагировать на события, создаваемые компонентом.

Создание поведений

Поведения создаются наследованием класса yii\base\Behavior:

Класс поведения MyBehavior содержит свойства prop1 и prop2, а также метод foo(). Свойство prop2 объявлено с использованием геттера getProp2() и сеттера setProp2(). Компоненту, к которому будет прикреплено это поведение, будут доступны свойства prop1 и prop2, и метод foo(). Внутри поведения можно обращаться к компоненту, к которому оно прикрплено, при помощи self::owner.

Обработка событий компонента

Если поведению требуется реагировать на события, нужно переопределить метод yii\base\Behavior::events(). Например,

Метод events() должен возвращать список событий и их обработчиков. В приведенном выше примере, объявлено событие yii\db\ActiveRecord::EVENT_BEFORE_VALIDATE и его обработчикbeforeValidate(). Указать обработчик в виде:

  • строки с именем метода текущего поведения;
  • массива, содержащего объект или имя класса, и имя метода, например, [$object, 'methodName'];
  • анонимной функции.

Функция обработчика события должна выглядеть так:

Прикрепление поведений

Чтобы прикрепить поведение статически, нужно переопределить метод yii\base\Component::behaviors() в компоненте, к которому оно будет прикреплено. Метод behaviors() должен возвращать список конфигураций поведений. Конфигурация поведения это имя класса поведения, либо массив его настроек:

Для поведения можно указать имя, задав его как ключ элемента массива в конфигурации(myBehavior2 и myBehavior4). Поведение с именем называется именованным, а без имени, соответственно, анонимным.

Чтобы прикрепить поведение динамически, необходимо вызвать метод yii\base\Component::attachBehavior() компонента, к которому оно будет прикреплено

Так же, прикрепить поведение к компоненту можно через конфигурацию:

Использование поведений

Можно обращаться к публичным переменным, методам или свойствам, объявленным с использованием геттеров и сеттеров в поведении, через компонент, к которому оно прикреплено:

Если два поведения, имеющие свойства или методы с одинаковыми именами, прикреплены к одному компоненту, преимущество будет у поведения, прикрепленного раньше.

Примеры работы с поведениями:

Пример: поведение TimestampBehavior

yii\behaviors\TimestampBehavior позволяет автоматически обновлять атрибуты с метками времени при сохранении AR моделей. Прикрепление поведения:

Конфигурация выше описывает следующее:

  • при вставке новой записи поведение должно присвоить текущую метку времени атрибутам created_at иupdated_at;
  • при обновлении существующей записи поведение должно присвоить текущую метку времени атрибутуupdated_at.

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

Поведение yii\behaviors\TimestampBehavior так же содержит метод yii\behaviors\TimestampBehavior::touch(), который устанавливает текущую метку времени указанному атрибуту и сохраняет его в базу данных:

Сравнение с трейтами

Плюсы поведений

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

Плюсы трейтов

  • не являются объектами, потому имеют высокую производительность;
  • поддерживаются многими IDE, поскольку являются стандартными конструкциями языка.

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

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