过滤器执行的过程 [ 2.0 版本 ]
/**
* 过滤器就是通过行为触发事件方式把 自己有过滤功能的类附加给控制器让他给过滤
* 行为注入,可以在不修改现有类的代码的情况下,更改、扩展类对于事件的响应和支持
* 这个行为(行为就是继承Bahavior的子类,子类中包含了所要注入的属性和方法)有点特殊他重写了Bahavior类的attach方法
* 这个过滤类->他继承了 base\ActionFilter类->他继承了Bahavior类他就是行为,就是ActionFilter类重写了attach方法
* public function attach($owner)
* {
* $this->owner = $owner;
* $owner->on(Controller::EVENT_BEFORE_ACTION, [$this, 'beforeFilter']);
* }
* 从上边代码看到他将ActionFilter类beforeFilter方法绑定给Controller::EVENT_BEFORE_ACTION事件
* 当控制器的EVENT_BEFORE_ACTION事件触发将会执行ActionFilter类beforeFilter方法
* public function beforeFilter($event)
* {
* if (!$this->isActive($event->action)) {
* return;
* }
* //执行子类(过滤类他首先要继承base\ActionFilter类)的beforeAction()方法如
* $event->isValid = $this->beforeAction($event->action);
* if ($event->isValid) {
* $this->owner->on(Controller::EVENT_AFTER_ACTION, [$this, 'afterFilter'], null, false);
* }else{
* $event->handled = true;
* }
* }
* 触发过程比较简单
* 每个Yii请求都会执行base\Controller的runAction在此方法会执行$this->beforeAction($action)方法
* public function beforeAction($action)
* {
* $event = new ActionEvent($action);
* $this->trigger(self::EVENT_BEFORE_ACTION, $event);
* return $event->isValid;
* }
* //这个方法就触发了EVENT_BEFORE_ACTION事件
*/
ffchen
注册时间:2016-05-21
最后登录:2020-06-13
在线时长:11小时29分
最后登录:2020-06-13
在线时长:11小时29分
- 粉丝2
- 金钱190
- 威望20
- 积分500
共 0 条评论