YII2框架的静态事件绑定

2 篇文章 0 订阅

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);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值