Пълното ръководство (v2) Поведения - Yii рамка на украинската общност
Поведенията са екземпляри на класа yii\base\Behavior или клас, получен от него. Поведенията, известни също като миксини, ви позволяват да разширите функционалността на съществуващите компоненти, без да се налага да променяте дървото на наследяването. След като поведението е прикрепено към bean, неговите методи и свойства се "инжектират" в bean-а и са достъпни точно така, сякаш са декларирани в самия клас на bean-а. В допълнение, поведението може да реагира на събития, предизвикани от компонента, което ви позволява да прецизирате или модифицирате нормалното изпълнение на кода на компонента.
Създаване на поведение #
Поведенията се създават чрез разширяване на базовия клас yii\base\Behavior или неговите наследници. Например,
В примера по-горе класът на поведение app\components\MyBehavior е деклариран, че съдържа 2 свойства prop1 и prop2 и един метод foo(). Имайте предвид, че свойството prop2 се декларира с помощта на getProp2() getter и setProp2() setter. Това е възможно, тъй като yii\base\Behavior е дъщерен клас на yii\base\BaseObject, който предоставя възможност за дефиниране на свойства чрез гетери и сетери.
Тъй като този клас е поведение, когато е прикрепен към компонент, свойствата prop1 и prop2, както и методът foo() също ще бъдат достъпни за компонента.
Съвет: В рамките на дадено поведение е възможно да получите достъп до компонента, към който е прикрепен, като използвате свойството 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.
Забележка: За да може горната конфигурация да работи с MySQL, типът created_at и updated_at трябва да бъде int(11) . Той ще съхранява клеймото за време на UNIX.
Сега, ако потребителският обект е записан, неговите атрибути created_at и updated_at автоматично ще бъдат зададени на времевата клеймо на UNIX към момента, в който записът е бил записан:
TimestampBehavior също съдържа полезен метод touch(), който задава текущия timestamp на посочения атрибут и го записва в базата данни:
Други поведения#
В допълнение към споменатите по-горе, има и други вече внедрени поведения. Както вградени, така и от трети страни:
Въпреки че поведенията са подобни на чертите по това, че "инжектират" своите свойства и методи в основния клас, те имат много разлики. И двете имат своите плюсове и минуси и по-скоро се допълват, а не заместват.
Ползи от поведението #
Поведенията, както всеки друг клас, поддържат наследяване. Чертите, от друга страна, могат да се разглеждат като copypaste на ниво език. Те не поддържат наследяване.
Поведенията могат да бъдат прикрепени и откачени от компонент динамично, без да е необходимо да се променя класът на компонента. За да използвате черти, трябва да модифицирате класа.
Поведението, за разлика от чертите, може да се персонализира.
Поведенията могат да бъдат конфигурирани да отговарят на компонентни събития.
Конфликтите на имена между свойствата и методите на поведение, прикрепени към компонент, се разрешават въз основа на реда, в който са прикачени. Конфликтите на имена, причинени от различни характеристики, изискват ръчно преименуване на конфликтните свойства или методи.
Черти ползи #
Чертите са много повечесе представят по-добре от поведенията, които, бидейки обекти, изискват допълнително време и памет.
Много IDE поддържат характеристики, тъй като са стандартни езикови конструкции.