Alexander Makarov
13 years ago
13 changed files with 207 additions and 189 deletions
@ -0,0 +1,79 @@ |
|||||||
|
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, our custom code will be executed. |
||||||
|
|
||||||
|
An event is identified by a name (unique within the class it is defined). Event names are *case-sensitive*. |
||||||
|
|
||||||
|
An event can be attached with one or multiple PHP callbacks, called *event handlers*. One can call [[trigger()]] to |
||||||
|
raise an event. When an event is raised, the attached event handlers will be invoked automatically in the order they are |
||||||
|
attached to the event. |
||||||
|
|
||||||
|
To attach an event handler to an event, call [[on()]]. For example, |
||||||
|
|
||||||
|
~~~ |
||||||
|
$comment->on('add', function($event) { |
||||||
|
// send email notification |
||||||
|
}); |
||||||
|
~~~ |
||||||
|
|
||||||
|
In the above, we attach an anonymous function to the "add" event of the comment. Valid event handlers include: |
||||||
|
|
||||||
|
- anonymous function: `function($event) { ... }` |
||||||
|
- object method: `array($object, 'handleAdd')` |
||||||
|
- static 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. |
||||||
|
|
||||||
|
One can also attach an event 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. |
||||||
|
|
||||||
|
One can call [[getEventHandlers()]] to retrieve all event handlers that are attached to a specified event. Because this |
||||||
|
method returns a [[Vector]] object, we can manipulate this object to attach/detach event handlers, or adjust their |
||||||
|
relative orders. |
||||||
|
|
||||||
|
~~~ |
||||||
|
$handlers = $comment->getEventHandlers('add'); |
||||||
|
$handlers->insertAt(0, $callback); // attach a handler as the first one |
||||||
|
$handlers[] = $callback; // attach a handler as the last one |
||||||
|
unset($handlers[0]); // detach the first handler |
||||||
|
~~~ |
||||||
|
|
||||||
|
|
||||||
|
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. |
@ -0,0 +1,39 @@ |
|||||||
|
A property is defined by a getter method (e.g. `getLabel`), and/or a setter method (e.g. `setLabel`). For example, |
||||||
|
the following getter and setter methods define a property named `label`: |
||||||
|
|
||||||
|
~~~ |
||||||
|
private $_label; |
||||||
|
|
||||||
|
public function getLabel() |
||||||
|
{ |
||||||
|
return $this->_label; |
||||||
|
} |
||||||
|
|
||||||
|
public function setLabel($value) |
||||||
|
{ |
||||||
|
$this->_label = $value; |
||||||
|
} |
||||||
|
~~~ |
||||||
|
|
||||||
|
Property names are *case-insensitive*. |
||||||
|
|
||||||
|
A property can be accessed like a member variable of an object. Reading or writing a property will cause the invocation |
||||||
|
of the corresponding getter or setter method. For example, |
||||||
|
|
||||||
|
~~~ |
||||||
|
// equivalent to $label = $object->getLabel(); |
||||||
|
$label = $object->label; |
||||||
|
// equivalent to $object->setLabel('abc'); |
||||||
|
$object->label = 'abc'; |
||||||
|
~~~ |
||||||
|
|
||||||
|
If a property has only a getter method and has no setter method, it is considered as *read-only*. In this case, trying |
||||||
|
to modify the property value will cause an exception. |
||||||
|
|
||||||
|
One can call [[hasProperty]], [[canGetProperty]] and/or [[canSetProperty]] to check the existence of a property. |
||||||
|
|
||||||
|
Besides the property feature, the Object class defines a static method [[create]] which provides a convenient |
||||||
|
alternative way of creating a new object instance. |
||||||
|
|
||||||
|
The Object class also defines the [[evaluateExpression]] method so that a PHP expression or callback can be dynamically |
||||||
|
evaluated within the context of an object. |
@ -1,115 +1,102 @@ |
|||||||
<?php |
<?php |
||||||
/** |
/** |
||||||
* CActiveRecordBehavior class file. |
* ActiveRecordBehavior class file. |
||||||
* |
* |
||||||
* @author Qiang Xue <qiang.xue@gmail.com> |
|
||||||
* @link http://www.yiiframework.com/ |
* @link http://www.yiiframework.com/ |
||||||
* @copyright Copyright © 2008-2011 Yii Software LLC |
* @copyright Copyright © 2008-2012 Yii Software LLC |
||||||
* @license http://www.yiiframework.com/license/ |
* @license http://www.yiiframework.com/license/ |
||||||
*/ |
*/ |
||||||
|
|
||||||
|
namespace yii\db\ar; |
||||||
|
|
||||||
|
use yii\base\ModelBehavior; |
||||||
|
|
||||||
/** |
/** |
||||||
* CActiveRecordBehavior is the base class for behaviors that can be attached to {@link CActiveRecord}. |
* ActiveRecordBehavior is the base class for behaviors that can be attached to [[ActiveRecord]]. |
||||||
* Compared with {@link CModelBehavior}, CActiveRecordBehavior attaches to more events |
* |
||||||
* that are only defined by {@link CActiveRecord}. |
* Compared to [[\yii\base\ModelBehavior]], ActiveRecordBehavior responds to more events |
||||||
|
* that are specific to [[ActiveRecord]]. |
||||||
* |
* |
||||||
* @author Qiang Xue <qiang.xue@gmail.com> |
* @author Qiang Xue <qiang.xue@gmail.com> |
||||||
* @since 2.0 |
* @since 2.0 |
||||||
*/ |
*/ |
||||||
class CActiveRecordBehavior extends CModelBehavior |
class ActiveRecordBehavior extends ModelBehavior |
||||||
{ |
{ |
||||||
/** |
/** |
||||||
* Declares events and the corresponding event handler methods. |
* Declares events and the corresponding event handler methods. |
||||||
* If you override this method, make sure you merge the parent result to the return value. |
* If you override this method, make sure you merge the parent result to the return value. |
||||||
* @return array events (array keys) and the corresponding event handler methods (array values). |
* @return array events (array keys) and the corresponding event handler methods (array values). |
||||||
* @see CBehavior::events |
* @see \yii\base\Behavior::events() |
||||||
*/ |
*/ |
||||||
public function events() |
public function events() |
||||||
{ |
{ |
||||||
return array_merge(parent::events(), array( |
return array_merge(parent::events(), array( |
||||||
'onBeforeInsert' => 'beforeInsert', |
'beforeInsert' => 'beforeInsert', |
||||||
'onAfterInsert' => 'afterInsert', |
'afterInsert' => 'afterInsert', |
||||||
'onBeforeUpdate' => 'beforeUpdate', |
'beforeUpdate' => 'beforeUpdate', |
||||||
'onAfterUpdate' => 'afterUpdate', |
'afterUpdate' => 'afterUpdate', |
||||||
'onBeforeDelete' => 'beforeDelete', |
'beforeDelete' => 'beforeDelete', |
||||||
'onAfterDelete' => 'afterDelete', |
'afterDelete' => 'afterDelete', |
||||||
'onBeforeFind' => 'beforeFind', |
|
||||||
'onAfterFind' => 'afterFind', |
|
||||||
)); |
)); |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* Responds to {@link CActiveRecord::onBeforeSave} event. |
* Responds to the owner's `beforeInsert` event. |
||||||
* Overrides this method if you want to handle the corresponding event of the {@link CBehavior::owner owner}. |
* Overrides this method if you want to handle the corresponding event of the owner. |
||||||
* You may set {@link CModelEvent::isValid} to be false to quit the saving process. |
* You may set the [[ModelEvent::isValid|isValid]] property of the event parameter |
||||||
* @param CModelEvent $event event parameter |
* to be false to quit the ActiveRecord inserting process. |
||||||
|
* @param \yii\base\ModelEvent $event event parameter |
||||||
*/ |
*/ |
||||||
public function beforeInsert($event) |
public function beforeInsert($event) |
||||||
{ |
{ |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* Responds to {@link CActiveRecord::onAfterSave} event. |
* Responds to the owner's `afterInsert` event. |
||||||
* Overrides this method if you want to handle the corresponding event of the {@link CBehavior::owner owner}. |
* Overrides this method if you want to handle the corresponding event of the owner. |
||||||
* @param CModelEvent $event event parameter |
* @param \yii\base\ModelEvent $event event parameter |
||||||
*/ |
*/ |
||||||
public function afterInsert($event) |
public function afterInsert($event) |
||||||
{ |
{ |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* Responds to {@link CActiveRecord::onBeforeSave} event. |
* Responds to the owner's `beforeUpdate` event. |
||||||
* Overrides this method if you want to handle the corresponding event of the {@link CBehavior::owner owner}. |
* Overrides this method if you want to handle the corresponding event of the owner. |
||||||
* You may set {@link CModelEvent::isValid} to be false to quit the saving process. |
* You may set the [[ModelEvent::isValid|isValid]] property of the event parameter |
||||||
* @param CModelEvent $event event parameter |
* to be false to quit the ActiveRecord updating process. |
||||||
|
* @param \yii\base\ModelEvent $event event parameter |
||||||
*/ |
*/ |
||||||
public function beforeUpdate($event) |
public function beforeUpdate($event) |
||||||
{ |
{ |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* Responds to {@link CActiveRecord::onAfterSave} event. |
* Responds to the owner's `afterUpdate` event. |
||||||
* Overrides this method if you want to handle the corresponding event of the {@link CBehavior::owner owner}. |
* Overrides this method if you want to handle the corresponding event of the owner. |
||||||
* @param CModelEvent $event event parameter |
* @param \yii\base\ModelEvent $event event parameter |
||||||
*/ |
*/ |
||||||
public function afterUpdate($event) |
public function afterUpdate($event) |
||||||
{ |
{ |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* Responds to {@link CActiveRecord::onBeforeDelete} event. |
* Responds to the owner's `beforeDelete` event. |
||||||
* Overrides this method if you want to handle the corresponding event of the {@link CBehavior::owner owner}. |
* Overrides this method if you want to handle the corresponding event of the owner. |
||||||
* You may set {@link CModelEvent::isValid} to be false to quit the deletion process. |
* You may set the [[ModelEvent::isValid|isValid]] property of the event parameter |
||||||
* @param CEvent $event event parameter |
* to be false to quit the ActiveRecord deleting process. |
||||||
|
* @param \yii\base\ModelEvent $event event parameter |
||||||
*/ |
*/ |
||||||
public function beforeDelete($event) |
public function beforeDelete($event) |
||||||
{ |
{ |
||||||
} |
} |
||||||
|
|
||||||
/** |
/** |
||||||
* Responds to {@link CActiveRecord::onAfterDelete} event. |
* Responds to the owner's `afterDelete` event. |
||||||
* Overrides this method if you want to handle the corresponding event of the {@link CBehavior::owner owner}. |
* Overrides this method if you want to handle the corresponding event of the owner. |
||||||
* @param CEvent $event event parameter |
* @param \yii\base\ModelEvent $event event parameter |
||||||
*/ |
*/ |
||||||
public function afterDelete($event) |
public function afterDelete($event) |
||||||
{ |
{ |
||||||
} |
} |
||||||
|
|
||||||
/** |
|
||||||
* Responds to {@link CActiveRecord::onBeforeFind} event. |
|
||||||
* Overrides this method if you want to handle the corresponding event of the {@link CBehavior::owner owner}. |
|
||||||
* @param CEvent $event event parameter |
|
||||||
*/ |
|
||||||
public function beforeFind($event) |
|
||||||
{ |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Responds to {@link CActiveRecord::onAfterFind} event. |
|
||||||
* Overrides this method if you want to handle the corresponding event of the {@link CBehavior::owner owner}. |
|
||||||
* @param CEvent $event event parameter |
|
||||||
*/ |
|
||||||
public function afterFind($event) |
|
||||||
{ |
|
||||||
} |
|
||||||
} |
} |
||||||
|
Loading…
Reference in new issue