Yii2 使用Event -1 ,如何使用事件_@TERRY

1.首先需要 定义 事件传递的数据格式类:

  1. <?php
  2. namespace myapp\frontend\code\ECM\Customer\events;
  3. use Yii;
  4. use yii\base\Model;
  5. use yii\base\Event;
  6. /**
  7. * ContactForm is the model behind the contact form.
  8. */
  9. class MessageEvent extends Event
  10. {
  11. public $message;
  12. }

在这个 MessageEvent 里面就定义了一个变量  $message

2.

编写事件:   事件只要定义个hello 函数,然后参数为  上面第一步分传递的$event 对象,里面包含$message 参数,如果这个Event执行

那么。将会写入日志。

  1. <?php
  2. namespace myapp\frontend\code\ECM\Customer\events;
  3. use Yii;
  4. /**
  5. * ContactForm is the model behind the contact form.
  6. */
  7. class Ha
  8. {
  9. public function hello($event){
  10. Yii::info($event->message,'mylog');
  11. }
  12. }

3

绑定和触发事件

  1. <?php
  2. namespace myapp\frontend\code\ECM\Cms\controllers;
  3. use Yii;
  4. use myapp\frontend\code\ECM\BaseController;
  5. use myapp\frontend\code\ECM\Customer\events\Ha;
  6. use myapp\frontend\code\ECM\Customer\events\MessageEvent;
  7. class IndexController extends BaseController
  8. {
  9. # 定义Event的名字
  10. const EVENT_HELLO = 'my hello';
  11. public function actionIndex()
  12. {
  13. #定义传递数据的格式 Event
  14. $event = new MessageEvent;
  15. # 赋值
  16. $event->message = 'good';
  17. # 绑定事件Event 这个事件对应的是:Ha->hello($event);
  18. $this->on(self::EVENT_HELLO, [new \myapp\frontend\code\ECM\Customer\events\Ha(), 'hello']);
  19. # 触发事件 ,$event 这个对象传递到 Ha->hello($event);
  20. $this->trigger(self::EVENT_HELLO,$event);
  21. return $this->render('index');
  22. }
  23. }

从这里看,貌似没有多大用处,直接作为参数调用就行了,两边都写代码麻烦

但是,事件是可以不再文件的函数内书写绑定,可以在new 对象之后再绑定

  1. $foo = new Foo;
  2. // 处理器是全局函数
  3. $foo->on(Foo::EVENT_HELLO, 'function_name');
  4. // 处理器是对象方法
  5. $foo->on(Foo::EVENT_HELLO, [$object, 'methodName']);

也可以在Behavior 行为绑定事件。

譬如在一个类保存的时候可以触发一个 保存后的事件

如果这个类没有绑定事件,那么执行为空

如果绑定,就会执行

1.如果一个Event,被多个类执行,一般使用Behavior的方式进行绑定,譬如  Avtive Record 保存后写入log

这种情况一般是自己写的类,使用别人写的,或者自己写的Event。进行一些处理

2.如果是系统的类,类的事件触发已经写好,但是没有绑定事件,默认什么也没有执行,譬如active Record 的 beforeSave操作

对于这种,我们不能去修改系统的代码,所以,我们可以通过$foo->on()的方式进行绑定,然后在执行save操作,就会触发beforeSave();

当然,我们可以定义一个子类,继承ActiveRecord,然后再里面添加行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值