Yii的事件机制

来源:互联网 发布:初中校园网络文化活动 编辑:程序博客网 时间:2024/06/05 05:00

1.环境搭建

我们在vendor目录创建event测试目录包含cat和mouse的两个类

要想拥有事件机制就要继承yii\base\Component  其中包含事件的触发 绑定 解绑等方法

cat:

namespace vendor\event;use yii\base\Component;use yii\base\Event;//创建一个事件对象 用于传递数据class MyEvent extends Event{    public $message;    public function data(){        echo 'abc';    }}//必须继承组件类 - 其中包含事件处理方法class Cat extends Component{    public function shout(Event $event){        echo 'miao miao miao<br />';        //当shout方法执行时触发miao事件 并接收一个参数        $this->trigger('miao',$event);    }}
mouse:

namespace vendor\event;class Mouse{    public function run($data){        //自定义事情        echo 'I want to run away<br />';        //处理参数        echo  $data->message;        $data->data();    }}
控制器中实现

namespace app\controllers;use yii\web\Controller;use vendor\event\Cat;use vendor\event\Mouse;use vendor\event\MyEvent;class TestController extends Controller{    public function actionTest(){        //实例化小猫 小鼠        $cat = new Cat();        $mourse = new Mouse();        //实例化事件对象 - 用以传递数据        $event = new MyEvent();        $event->message = 'i am data<br />';        //给小猫的miao事件绑定一个处理方法        $cat->on('miao', [$mourse, 'run'],$message);//这里可以是匿名函数或$message作为参数3 以事件属性方式调用        $cat->off('miao', [$mourse, 'run']);//解绑小鼠的run方法        //小猫触发事件        $cat->shout($event);        return $this->renderPartial('test');    }}

运行结果

miao miao miaoI want to run awayi am dataabc
----------------------------------------------------------------------------------------------------------------------------------------------------------以上是单个实例的触发绑定

怎样实现类级别的绑定功能呢? 使用\yii\base\Event::on(); 方法。用法如下

\yii\base\Event::on(Cat::className, '事件名', [处理类, 处理动作]);


这样所有Cat的实例都会触发到指定事件,

0 0