A behavior (also knows as mixin) can be used to enhance the functionality of an existing component without modifying its
A behavior (also knows as *mixin*) can be used to enhance the functionality of an existing component without modifying the component's
code. In particular, it can "inject" its own methods and properties into the component and make them directly accessible
code. In particular, a behavior can "inject" its own methods and properties into the component, making them directly accessible
via the component. It can also respond to the events triggered in the component and thus intercept the normal
via the component itslef. A behavior can also respond to events triggered in the component, thus intercepting the normal
code execution. Unlike PHP traits, behaviors could be attached to classes at runtime.
code execution. Unlike [PHP's traits](http://www.php.net/traits), behaviors can be attached to classes at runtime.
Using behaviors
Using behaviors
---------------
---------------
Behavior can be attached to any class that extends from `Component`. In order to do so you need to implement`behaviors`
A behavior can be attached to any class that extends from `Component`. In order to attach a behavior to a class, the component class must implement the`behaviors`
method. Yii provides `AutoTimestamp` behavior that handles updating timestamp fields on saving active record model.
method. As an example, Yii provides the `AutoTimestamp` behavior for automatically updating timestamp fields when saving an Active Record model:
```php
```php
classUserextendsActiveRecord
classUserextendsActiveRecord
...
@@ -32,10 +32,59 @@ class User extends ActiveRecord
...
@@ -32,10 +32,59 @@ class User extends ActiveRecord
}
}
```
```
In the above `class` value is a string containing fully qualified behavior class name. All the other key-values are
In the above, the `class` value is a string representing the fully qualified behavior class name. All of the other key-value pairs represent corresponding public properties of the `AutoTimestamp` class, thereby customizing how the behavior functions.
assigned to corresponding properties of the class.
Creating your own behaviors
Creating your own behaviors
---------------------------
---------------------------
TBD
[[NEEDS UPDATING FOR Yii 2]]
\ No newline at end of file
To create your own behavior, you must define a class that implements the `IBehavior` interface. This can be accomplished by extending `CBehavior`. More specifically, you can extend `CModelBehavior` or `CActiveRecordBehavior` for behaviors to be used specifically with models or with Active Record models.
```php
classMyBehaviorextendsCActiveRecordBehavior
{
}
```
To make your behavior customizable, like `AutoTimestamp`, add public properties:
```php
classMyBehaviorextendsCActiveRecordBehavior
{
public$attr;
}
```
Now, when the behavior is used, you can set the attribute to which you'd want the behavior to be applied:
```php
classUserextendsActiveRecord
{
// ...
publicfunctionbehaviors()
{
return[
'mybehavior'=>[
'class'=>'ext\mybehavior\MyBehavior',
'attr'=>'member_type'
],
],
];
}
}
```
Behaviors are normally written to take action when certain model-related events occur, such as `beforeSave` or `afterFind`. You can write your behaviors to have the corresponding method. Within the method, you can access the model instance through `$this->getOwner()`: