Поведінки - основні поняття - повне керівництво по yii 2

Поведінки (behaviors) - це екземпляри класу yii \ base \ Behavior або класу, успадкованого від нього. Поведінки, також відомі як домішки. дозволяють розширювати функціональність існуючих компонентів без необхідності зміни дерева успадкування. Після прикріплення поведінки до компоненту, його методи і властивості "впроваджуються" в компонент, і стають доступними так само, як якщо б вони були оголошені в самому класі компонента. Крім того, поведінка може реагувати на події. створювані компонентом, що дозволяє точно керувати або модифікувати звичайне виконання коду компонента.

створення поводжень

Поведінки створюються шляхом розширення базового класу yii \ base \ Behavior або його спадкоємців. наприклад,

У наведеному вище прикладі, оголошений клас поведінки app \ components \ MyBehavior містить 2 властивості prop1 і prop2. і один метод foo (). Зверніть увагу, властивість prop2 оголошено з використанням геттера getProp2 () і сетера setProp2 (). Це можливо, тому що yii \ base \ Behavior є дочірнім класом для yii \ base \ BaseObject. який надає можливість визначення властивостей через геттери і сеттери.

Так як цей клас є поведінкою, коли він прикріплений до компоненту, компоненту будуть також доступні властивості prop1 і prop2. а також метод foo ().

Tip: Всередині поведінки можливо звертатися до компоненту, до якого воно прикріплене, використовуючи властивість yii \ base \ Behavior :: $ owner.

Обробка подій компонента

Якщо поведінки потрібно реагувати на події компонента, до якого воно прикріплене, то необхідно перевизначити метод yii \ base \ Behavior :: events (). наприклад,

Метод events () повинен повертати список подій і відповідних їм оброблювачів. У наведеному вище прикладі, оголошено подія EVENT_BEFORE_VALIDATE і його обробник beforeValidate (). Вказати обробник події, можна одним з таких способів:

  • рядок з ім'ям методу поточного поведінки, як в прикладі вище;
  • масив, що містить об'єкт або ім'я класу, і ім'я методу, наприклад, [$ object, 'methodName'];
  • анонімна функція.

Функція обробника події повинна виглядати як показано нижче, де $ event містить параметр події. Більш детальна інформація наведена в розділі Події.

прикріплення поводжень

Прикріпити поведінку до компоненту можна як статично, так і динамічно. На практиці частіше використовується статичне прикріплення.

Для того щоб прикріпити поведінку статично, необхідно перевизначити метод behaviors () компонента, до якого його планується прикріпити. Метод behaviors () повинен повертати список конфігурацій поводжень. Конфігурація поведінки являє собою ім'я класу поведінки, або масив його налаштувань:

Ви можете пов'язати ім'я з поведінкою, вказавши його в якості ключа елемента масиву, відповідного зміни поведінки. В такому випадку, поведінка називається іменованих. В наведеному вище прикладі, два іменованих поведінки: myBehavior2 і myBehavior4. Якщо з поведінкою не пов'язане ім'я, така поведінка називається анонімним.

Для того, щоб прикріпити поведінку динамічно, необхідно викликати метод yii \ base \ Component :: attachBehavior () необхідного компонента:

Використання методу yii \ base \ Component :: attachBehaviors () дозволяє прикріпити кілька поводжень за раз. наприклад,

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

Більш детальна інформація наведена в розділі Зміни.

Використання поводжень

Для використання поведінки, його необхідно прикріпити до компоненту як описано вище. Після того, як поведінка прикріплено до компоненту, його використання не викликає складнощів.

Ви можете звертатися до публічних змінним або властивостями. оголошеним з використанням геттеров і сеттерів в поведінці, через компонент, до якого воно прикріплене:

Аналогічно, ви можете викликати публічні методи поведінки,

Зверніть увагу, хоча $ component не має властивості prop1 і методу foo (). вони можуть бути використані, як ніби є членами цього класу.

У разі, коли два поведінки, які мають властивості або методи з однаковими іменами, прикріплені до одного компоненту, перевага буде у поведінки, прикріпленого раніше.

Якщо при прикріпленні поведінки до компоненту зазначено ім'я, можна звертатися до поведінки з цього імені, як показано нижче:

Також можна отримати все поведінки, прикріплені до компоненту:

отвязиваніе поводжень

Щоб відв'язати поведінку від компонента, необхідно викликати метод yii \ base \ Component :: detachBehavior (). вказавши ім'я, пов'язане з поведінкою:

Так само, можливо відв'язати все поведінки:

Використання поведінки TimestampBehavior

У висновку, давайте подивимося на yii \ behaviors \ TimestampBehavior - поведінка, яке дозволяє автоматично оновлювати атрибути з мітками часу при збереженні Active Record моделей через insert (). update () або save ().

Для початку, необхідно прикріпити поведінку до класу Active Record. в якому це необхідно:

Конфігурація вище описує наступне:

  • при вставці нового запису поведінка повинна привласнити поточну мітку часу UNIX атрибутів created_at і updated_at;
  • при оновленні існуючої записи поведінка повинна привласнити поточну мітку часу UNIX атрибуту updated_at.

Note: Для того, щоб наведена вище конфігурація працювала з MySQL, тип created_at і updated_at повинен бути int (11). У ньому буде зберігатися UNIX timestamp.

Тепер, якщо зберегти об'єкт User. то в його атрибути created_at і updated_at будуть автоматично встановлені значення мітки часу UNIX на момент збереження запису:

Поведінка TimestampBehavior так само містить корисний метод touch (). який встановлює поточну мітку часу вказаною атрибуту і зберігає його в базу даних:

інші поведінки

Крім порушених вище, є й інші вже реалізовані поведінки. Як вбудовані, так і сторонні:

  • yii \ behaviors \ BlameableBehavior - автоматично заповнює зазначені атрибути ID поточного користувача.
  • yii \ behaviors \ SluggableBehavior - автоматично заповнює зазначені атрибут придатним для URL текстом, що одержуються з іншого атрибута.
  • yii \ behaviors \ AttributeBehavior - автоматично задає вказане значення одному або декільком атрибутам ActiveRecord при спрацьовуванні певних подій.
  • yii2tech \ ar \ softdelete \ SoftDeleteBehavior - надає методи для «м'якого» видалення і воосстановленія ActiveRecord. Тобто виставляє статус або прапор, який показує, що запис видалений.
  • yii2tech \ ar \ position \ PositionBehavior - дозволяє упралять порядком записів через спеціальні методи. Інформація зберігається в целочисленном поле.

Порівняння з трейтамі

Незважаючи на те, що поведінки схожі з трейтамі тим, що "впроваджують" свої властивості і методи в основний клас, вони мають безліч відмінностей. Вони обидва мають свої плюси і мінуси, і, скоріше, доповнюють один одного, а не замінюють.

плюси поводжень

Поведінки, як і будь-які інші класи, підтримують успадкування. Трейти ж можна розглядати як копіпейст на рівні мови. Вони спадкування не підтримують.

Поведінки можуть бути прикріплені і відв'язані від компонента динамічно, без необхідності модифікування класу компонента. Для використання трейтов необхідно модифікувати клас.

Поведінки, на відміну від трейтов, можна налаштовувати.

Поведінки можна налаштовувати таким чином, щоб вони реагували на події компонента.

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

плюси трейтов

Трейти є набагато більш продуктивними, ніж поведінки, які, будучи об'єктами, вимагають додаткового часу і пам'яті.

Багато IDE підтримують роботу з трейтамі, так як вони є стандартними конструкціями мови.

Схожі статті