Difference between #1 and #2 of Behaviors & events

unchanged
Title
Behaviors & events
unchanged
Category
Tutorials
unchanged
Tags
changed
Content
These features provide endless possibilities and unbelievable flexibility, but
as current documentation does not give more than a few examples, it might be
difficult to fully understand their internals and requirements.

It should be noted that they do mostly the same thing. You can attach behaviors
and event handlers to components to modify the components' behavior.

##Events

It is useful when you want to interrupt the normal application flow without
extending base classes.

For example, [enabling gzip](http://www.yiiframework.com/doc/cookbook/39/)
compression on the output could be done via extending CWebApplication. But
because there are entry points for event handlers, one can do this:

~~~
[php]
Yii::app()->onbeginRequest = create_function('$event', 'return
ob_start("ob_gzhandler");'),
Yii::app()->onendRequest = create_function('$event', 'return
ob_end_flush();'),
~~~

You can create an event handler -- which is simply a method in some class with a
specific signature -- and attach it to the event of an object. You can add as
many event handlers as you wish, from as many objects as you wish. If the event
handler is, effectively static, then you can create the object as you assign it:

~~~
[php]
$test_comp->onSomethingGoesOn = array(new SomeClass, 'eventHandler1');
$test_comp->onSomethingGoesOn = array(new SomeOtherClass, 'eventHandler2');
$test_comp->onSomethingGoesOn = array(new YetAnotherClass, 'eventHandler3');
~~~

As long as you have a handle on the object, then you can add an event handler to
it.

At some point, you can then raise the event with something like one of these:

~~~
[php]
$test_comp->onSomethingGoesOn(new CEvent($this));
$test_comp->onSomethingGoesOn(new CEvent());
~~~

So, basically, it allows you build a list of function calls that can later be
executed, in the order they were added. It can save you passing around a lot of
object refs and building conditional code, since you can still raise the event,
even if it doesn't do anything.

##Behaviors

Behaviors are simply a way of adding methods to an object. In an OO language
like Ruby, it's quite possible to start with an completely empty object and
simply build its behavior as you go along. Yii provides this behavior with a
little magic. The key is that the class you wish to add the behavior from must
extend Cbehavior.

~~~
[php]
class SomeClass extends CBehavior
{
    public function add($x, $y) { return $x + $y; }
}
~~~

Then use with:

~~~
[php]
$test_comp = new TestComponent(); 
$test_comp->attachbehavior('blah', new SomeClass);
$test_comp->add(2, 5);
~~~

So, in this case, you are extending the functionality of an object with
functionality of another object.

After studying this cookbook page it is encouraged to reread the [corresponding
guide page](http://www.yiiframework.com/doc/guide/basics.component) as it
contains advanced information (for example, if you are familiar with interfaces,
you might find it enough to implement IBehavior before extending CBehavior).
Write new article
  • Written by: pestaa
  • Updated by: Gismo
  • Category: Tutorials
  • Yii Version: 1.1
  • Votes: +50
  • Viewed: 95,239 times
  • Created on: Aug 24, 2009
  • Last updated: Jan 10, 2013