Способи підключення поводжень (behavior) в yii2

Поведінка - це не тільки можливість повісити подія на дію, але ще і потужний інструмент, що дає необмежені можливості повторного використання коду. Принадність поводжень в тому, що кріпитися вони можуть до чого завгодно. Наприклад: якщо всі моделі використовують метод updateItem (), то його можна винести в окремий клас і отнаследовать від нього всі моделі. А що робити якщо метод може бути не тільки у моделі, а й у контролера або подання? Що робити, якщо не всі моделі повинні мати доступ до загального методу? На допомогу приходять поведінки.
Я вже писала про поведінки. про те, на які події можна на них вішати. Треба б розписати ще як самому створювати ці події, але сьогодні поговоримо про способи прикріплення поводжень до об'єкта.

Спосіб 1: прив'язка з контролера

В даному прикладі після логіна користувача викликається метод setUserInfoInSession в моделі User

Спосіб 2: прив'язка на рівні об'єкта

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

У наведеному вище прикладі підключається 3 поведінки. Два з них через окремий клас і останнім у вигляді анонімної функції. Якщо ви робите окремий клас, то він розширює модель, ті публічні методи цього класу стають доступними з моделі. Так само в класі можна прописати спрацьовування поводжень на подію.
Приклад поведінки DateTimeBehavior.

Підключаючи цей клас до моделі, я отримую виклик методів convertDate і convertDateToDB після знаходження запису і перед валідацією.
Прив'язати таким чином поведінки можна для будь-якого класу, в тому числі і контролера.

Спосіб 3: прив'язка з конфіга

Прописати подію можна і в конфіги, в настройках компонентів.

Підключати можна все тими-ж 3 способами: у вигляді виклику глобальної функції, виклику методу у об'єкта або у вигляді анонімної функції. У моєму прикладі - виклик методу класу.
Залишилося тільки нагадати, що сам додаток - це теж об'єкт, у якого є свої події. А значить до нього теж можна підключати поведінки

добрий вечір
Порадьте як правильно зробити.
Є 2 модуля:
У 1ом модель User, а в 2Ом SomeBehavior
Треба додати це поведінка не для конкретного користувача $ user, а для всіх, як це було-б додавши його просто в метод behaviors () моделі User.
При цьому 1-ий модуль не залежимо від 2ого

Так ось я бачу 2 способи:
1) Вивести поведінки моделі User в конфіги:
в грубому вигляді щось типу:
class User ...
behaviors () return array_merge ([
...
], Yii :: $ app-> params [ 'userBehaviors']);
>
>

а в Модуле2:
class Module2 implements BootstrapInterface
public function bootstrap ($ app) $ app-> params [ 'userBehaviors']. [];
$ App-> params [ 'userBehaviors'] [ 'myBehavior'] = MyBehavior :: className ();
>
>

І 2 спосіб відловлювати подія AFTER_FIND у користувача, і додавати через attachBehavior ()
але цей спосіб здається гірше ніж перший

Другий спосіб менш прозорий ніж перший, перший мені подобається найбільше. Подброщу ще ідею: додати виклик події в behaviors ($ this-> trigger (...)) і дати можливість будь-кому віщати свої обробники. Теж не прозоро, зате більш гнучко (поведінку можна говорити без прописки в конфіги, буває корисно для інтеграції двох сторонніх модулів, коли переписувати клас будь-якого з них можна тільки спадкуванням).

Схожі статті