1.先绑定需要触发的事件名称
所有继承Component的类,才有此功能。
//可以在初始化类的时候进行绑定:
class Trigger
{
const EVENT1 = 'event1';
//绑定将会处理此事件的类和方法-此处绑定HandleService中的move静态方法
public function init()
{
$this->on(self::EVENT1, ['\common\services\HandleService', 'move']);
}
}
//任意的静态类
class HandleService
{
public static function move($event)
{
print_r($event);
}
}
//on方法的详细步骤--感兴趣可以看以下代码
public function on($name, $handler, $data = null, $append = true)
{
$this->ensureBehaviors();
if ($append || empty($this->_events[$name])) {
$this->_events[$name][] = [$handler, $data];
} else {
array_unshift($this->_events[$name], [$handler, $data]);
}
}
2.在特定动作后触发绑定的事件
$triggerService = new \common\services\TriggerService();
echo "<br>start trigger";
$triggerService->trigger(\common\services\TriggerService::EVENT1);
echo "<br>end trigger";
运行查看结果
//HandleService::move()将会打印以下内容:
yii\base\Event Object ( [name] => event1 [sender] => common\services\TriggerService Object ( [_events:yii\base\Component:private] => Array ( [event1] => Array ( [0] => Array ( [0] => Array ( [0] => \common\services\HandleService [1] => move ) [1] => ) ) ) [_behaviors:yii\base\Component:private] => Array ( ) ) [handled] => [data] => )
//触发此方法的对象为:
[sender] => common\services\TriggerService
//此触发事件的名字:
[name] => event1
至此,通过对象触发静态方法已经完成。但这往往无法满足生产要求,我们希望触发此事件时能把其他数据传送给处理函数(即move方法)。
3.传送其他数据给move方法
//Event对象的数据结构为
class Event
{
public $name;
public $sender;
public $handled;
public $data;
}
3.1通过绑定事件时,增加数据
$this->on(self::EVENT1, ['\common\services\HandleService', 'move'],'绑定事件时增加数据');
绑定事件时增加数据 字符串会 赋值给Event::$data
3.2通过触发事件时,增加数据
class DataEvent extends Event
{
protected $need = [];
public function setNeed($data)
{
$this->need = $data;
}
}
$triggerService->trigger(\common\services\TriggerService::EVENT1, new DataEvent(['need'=>['user_id','order_id']]));
打印可发现move( event)中 event 包含了need字段,里面为数组[‘user_id’,’order_id’]
其他
BaseYii.php
/**
* Configures an object with the initial property values.
* @param object $object the object to be configured
* @param array $properties the property initial values given in terms of name-value pairs.
* @return object the object itself
*/
public static function configure($object, $properties)
{
foreach ($properties as $name => $value) {
$object->$name = $value;
}
return $object;
}
当我们直接调用对象的赋值操作时,就会触发PHP的魔法函数__set方法。此方法YII2框架进行了重写,代码如下:
首先会判断此对象是否set方法,有则赋值,无则抛出异常。
//Object.php
public function __set($name, $value)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
$this->$setter($value);
} elseif (method_exists($this, 'get' . $name)) {
throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
} else {
throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
}
}