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的实例都会触发到指定事件,