|  |  |  | Component provides the *event* and *behavior* features, in addition to the *property* feature which is implemented in
 | 
					
						
							|  |  |  | its parent class [[Object]].
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Event is a way to "inject" custom code into existing code at certain places. For example, a comment object can trigger
 | 
					
						
							|  |  |  | an "add" event when the user adds a comment. We can write custom code and attach it to this event so that when the event
 | 
					
						
							|  |  |  | is triggered (i.e. comment will be added), our custom code will be executed.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | An event is identified by a name that should be unique within the class it is defined at. Event names are *case-sensitive*.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | One or multiple PHP callbacks, called *event handlers*, can be attached to an event. You can call [[trigger()]] to
 | 
					
						
							|  |  |  | raise an event. When an event is raised, the event handlers will be invoked automatically in the order they were
 | 
					
						
							|  |  |  | attached.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To attach an event handler to an event, call [[on()]]:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~
 | 
					
						
							|  |  |  | $post->on('update', function($event) {
 | 
					
						
							|  |  |  |     // send email notification
 | 
					
						
							|  |  |  | });
 | 
					
						
							|  |  |  | ~~~
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In the above, an anonymous function is attached to the "update" event of the post. You may attach
 | 
					
						
							|  |  |  | the following types of event handlers:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | - anonymous function: `function($event) { ... }`
 | 
					
						
							|  |  |  | - object method: `array($object, 'handleAdd')`
 | 
					
						
							|  |  |  | - static class method: `array('Page', 'handleAdd')`
 | 
					
						
							|  |  |  | - global function: `'handleAdd'`
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The signature of an event handler should be like the following:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~
 | 
					
						
							|  |  |  | function foo($event)
 | 
					
						
							|  |  |  | ~~~
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | where `$event` is an [[Event]] object which includes parameters associated with the event.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | You can also attach a handler to an event when configuring a component with a configuration array.
 | 
					
						
							|  |  |  | The syntax is like the following:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~
 | 
					
						
							|  |  |  | array(
 | 
					
						
							|  |  |  |     'on add' => function($event) { ... }
 | 
					
						
							|  |  |  | )
 | 
					
						
							|  |  |  | ~~~
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | where `on add` stands for attaching an event to the `add` event.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Sometimes, you may want to associate extra data with an event handler when you attach it to an event
 | 
					
						
							|  |  |  | and then access it when the handler is invoked. You may do so by
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~
 | 
					
						
							|  |  |  | $post->on('update', function($event) {
 | 
					
						
							|  |  |  |     // the data can be accessed via $event->data
 | 
					
						
							|  |  |  | }, $data);
 | 
					
						
							|  |  |  | ~~~
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | A behavior is an instance of [[Behavior]] or its child class. A component can be attached with one or multiple
 | 
					
						
							|  |  |  | behaviors. When a behavior is attached to a component, its public properties and methods can be accessed via the
 | 
					
						
							|  |  |  | component directly, as if the component owns those properties and methods.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | To attach a behavior to a component, declare it in [[behaviors()]], or explicitly call [[attachBehavior]]. Behaviors
 | 
					
						
							|  |  |  | declared in [[behaviors()]] are automatically attached to the corresponding component.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | One can also attach a behavior to a component when configuring it with a configuration array. The syntax is like the
 | 
					
						
							|  |  |  | following:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ~~~
 | 
					
						
							|  |  |  | array(
 | 
					
						
							|  |  |  |     'as tree' => array(
 | 
					
						
							|  |  |  |         'class' => 'Tree',
 | 
					
						
							|  |  |  |     ),
 | 
					
						
							|  |  |  | )
 | 
					
						
							|  |  |  | ~~~
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | where `as tree` stands for attaching a behavior named `tree`, and the array will be passed to [[\Yii::createObject()]]
 | 
					
						
							|  |  |  | to create the behavior object.
 |