Yii的事件机制 - 简单实例

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 miao
I want to run away
i am dataabc
----------------------------------------------------------------------------------------------------------------------------------------------------------以上是单个实例的触发绑定

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

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


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

猜你喜欢

转载自blog.csdn.net/u012910292/article/details/58170358