YII2框架学习 扩展篇(二) 事件机制
2017-06-28 20:54
429 查看
今天学习YII框架的事件机制,某个对象可以抛出一些事件,而其他的对象可以监听这些事件,然后调用相应的方法。而具体的实现方式可以分为扫描式和绑定式。而YII框架使用的就是绑定式。下面来详细讲解一下。
所谓绑定式,是由事件执行时,通过Component类下的trigger()方法抛出事件,然后通过on()方法来绑定其他对象对此事件的反应。下面通过一个简单的猫叫老鼠跑的例子来说明。这个一个一对一的事件机制。
1.一个一对一的事件机制
cat.php
namespace vendor\animal;
use \yii\base\Component;
class MyEvent extends Event{
public $message;
}
class Cat extends Component{
public function shout(){
echo 'cat miao<br>';
$this->trigger('miao',$me);
}
}mouse.php
namespace vendor\animal;
class Mouse{
public function run(){
echo 'mouse running<br>';//老鼠跑事件
}
}控制器
namespace app\controllers;
use yii\web\Controller;
use vendor\animal\Cat;
use vendor\animal\Mouse;
use vendor\animal\Dog;
use \yii\base\Event;
class HelloController extends Controller{
public function actionAbout(){
$cat = new Cat;
$mouse = new Mouse;
$cat->on('miao',[$mouse,'run']);//为miao事件绑定老鼠跑事件
$cat->shout();
}
}输出为
miao
mouse running
2.带参数的事件
有的时候,事件需要参数才能让其他对象反应的,比如报警119,需要告知着火地点。可以通过trigger来写入事件信息。
cat.php
namespace vendor\animal;
use \yii\base\Component;
use \yii\base\Event;
class MyEvent extends Event{
public $message;
}
class Cat extends Component{
public function shout(){
echo 'cat miao<br>';//猫叫事件
$me = new MyEvent;
$me->message = 'hello<br>';//事件参数
$this->trigger('miao',$me);//抛出名为miao的事件,附上参数$me对象
}
}mouse.php
namespace vendor\animal;
class Mouse{
public function run($me){
echo $me->message;
echo 'mouse running<br>';//老鼠跑事件
}
}
输出
miao
hello
mouse running
3.触发多个事件
可以加上dog.php
namespace vendor\animal;
class Dog{
public function run($me){
echo $me->message;
echo 'dog catch<br>';
}
}
控制器加上
$cat->on('miao',[$dog,'run']);
要想接触绑定
$cat->off('miao',[$dog,'run']);
输出
miao
hello
mouse running
hello
dog catch
4.类触发事件
有的时候,不只是某只实例化的猫,只要是只猫叫就想让老鼠跑的话,可以这么写on
Event::on(Cat::className(),'miao',[$mouse,'run']);
而在应用主体在程序中像一条主线一样,在主线当时是用$app这个单例模式去触发各种各样的事件。这些事件又被需要的对象或程序所捕获,对它做出各种各样的一些处理。这样做的好处是在不改动原来的程序或主流逻辑的的情况下,就可以通过这些时间去完成各种各样的操作,让程序有更好的扩展性。
所谓绑定式,是由事件执行时,通过Component类下的trigger()方法抛出事件,然后通过on()方法来绑定其他对象对此事件的反应。下面通过一个简单的猫叫老鼠跑的例子来说明。这个一个一对一的事件机制。
1.一个一对一的事件机制
cat.php
namespace vendor\animal;
use \yii\base\Component;
class MyEvent extends Event{
public $message;
}
class Cat extends Component{
public function shout(){
echo 'cat miao<br>';
$this->trigger('miao',$me);
}
}mouse.php
namespace vendor\animal;
class Mouse{
public function run(){
echo 'mouse running<br>';//老鼠跑事件
}
}控制器
namespace app\controllers;
use yii\web\Controller;
use vendor\animal\Cat;
use vendor\animal\Mouse;
use vendor\animal\Dog;
use \yii\base\Event;
class HelloController extends Controller{
public function actionAbout(){
$cat = new Cat;
$mouse = new Mouse;
$cat->on('miao',[$mouse,'run']);//为miao事件绑定老鼠跑事件
$cat->shout();
}
}输出为
miao
mouse running
2.带参数的事件
有的时候,事件需要参数才能让其他对象反应的,比如报警119,需要告知着火地点。可以通过trigger来写入事件信息。
cat.php
namespace vendor\animal;
use \yii\base\Component;
use \yii\base\Event;
class MyEvent extends Event{
public $message;
}
class Cat extends Component{
public function shout(){
echo 'cat miao<br>';//猫叫事件
$me = new MyEvent;
$me->message = 'hello<br>';//事件参数
$this->trigger('miao',$me);//抛出名为miao的事件,附上参数$me对象
}
}mouse.php
namespace vendor\animal;
class Mouse{
public function run($me){
echo $me->message;
echo 'mouse running<br>';//老鼠跑事件
}
}
输出
miao
hello
mouse running
3.触发多个事件
可以加上dog.php
namespace vendor\animal;
class Dog{
public function run($me){
echo $me->message;
echo 'dog catch<br>';
}
}
控制器加上
$cat->on('miao',[$dog,'run']);
要想接触绑定
$cat->off('miao',[$dog,'run']);
输出
miao
hello
mouse running
hello
dog catch
4.类触发事件
有的时候,不只是某只实例化的猫,只要是只猫叫就想让老鼠跑的话,可以这么写on
Event::on(Cat::className(),'miao',[$mouse,'run']);
而在应用主体在程序中像一条主线一样,在主线当时是用$app这个单例模式去触发各种各样的事件。这些事件又被需要的对象或程序所捕获,对它做出各种各样的一些处理。这样做的好处是在不改动原来的程序或主流逻辑的的情况下,就可以通过这些时间去完成各种各样的操作,让程序有更好的扩展性。
相关文章推荐
- YII2框架学习 扩展篇(一) 模块化设计
- YII2框架学习 扩展篇(四) 依赖注入
- sip中包含3种扩展方法的事件通告机制学习综述-----阿冬
- YII2框架学习 扩展篇(三) Mixin技术
- NS2学习(4)——事件调度机制
- Ubuntu启动流程学习笔记(Upstart事件机制)
- 扩展Spring系列(2) ---Spring对各种数据访问框架的集成机制
- AS3.0实例学习 熟悉新的事件机制和addChild的运用
- AWT事件处理机制学习
- Flex学习-事件机制的工作流程
- 【转】玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制
- C#事件机制学习
- 【转】玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制
- 玩转 Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制(转载)
- SIP事件通告扩展机制
- Spring学习-webcontex的自动配置和事件传播机制及使用
- 游戏框架设计Ⅰ—— 游戏中的事件机制
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制
- SDL入门学习二.事件查询机制