yii2 随笔(六)利用事件触发修改请求参

yii2 可以使用事件机制来触发特殊的处理,实现了代码扩展,可以理解为在yii2内核层已经埋下了隐藏的“钩子”,用于后期扩展,比如 yii\base\application::run() 方法就埋下了两个“钩子”

public function run()  
    {  
        try {  
  
            $this->state = self::STATE_BEFORE_REQUEST;  
            //触发第一个事件(钩子) ,在执行主体之前方面修改一些参数  
            $this->trigger(self::EVENT_BEFORE_REQUEST);  
  
            $this->state = self::STATE_HANDLING_REQUEST;  
            $response = $this->handleRequest($this->getRequest());  
            //触发第二个事件(“钩子”),用于处理运行主体之后,触发一些逻辑  
            $this->state = self::STATE_AFTER_REQUEST;  
            $this->trigger(self::EVENT_AFTER_REQUEST);  
  
            $this->state = self::STATE_SENDING_RESPONSE;  
            $response->send();  
  
            $this->state = self::STATE_END;  
  
            return $response->exitStatus;  
  
        } catch (ExitException $e) {  
  
            $this->end($e->statusCode, isset($response) ? $response : null);  
            return $e->statusCode;  
  
        }  
    } 

我们利用第一个事件,触发修改路由控制,仅作测试使用
1. 在 config/web.php 中添加配置

//添加一个路径别名,可以理解为注册一个新的包为sdk,包的路径为 指定的文件夹。  
yii::setAlias('sdk', dirname(__DIR__).'/sdk');  
//注册一个名为test 的组件,并指定组件所对应的对象,yii2 使用 createObject 方法自动创建这个对象。其他的键可以代表 test 组件的属性值(如果有的话)。  
$config['components']['test'] => ['class'=>'sdk\Test'];  
//test 组件自动加载  
$config['bootstrap'][] = 'test';  

2. 在根目录(和config同级目录)创建sdk目录,在sdk目录下创建Test.php,代码如下:

<?php
namespace sdk;  
  
use Yii;  
//注意大小写,应完全与文件名一样,首字母大写是yii2的规范。  
//这里继承Object是因为配合yii2的运行方式,使用init()函数作为代码的初识话函数,当然仅仅做本此事需求的话,可以写在构造函数里,而不用继承任何基类  
class Test extends yii\base\Object{  
    //构造函数时运行  
    public function init(){  
        //在App里面注册一个处理事件,该事件对应上面提到的yii\base\Application::run()里的第一个事件  
        Yii::$app->on(yii\base\Application::EVENT_BEFORE_REQUEST, function($event){  
            //得到request 对象  
            $request = Yii::$app->getRequest();  
            //检查该对象源码,发现该对象可以修改的内容均为 set.... 开头的,这里用setPathInfo(),设置路由控制器的(用于指定解析本次处理的控制器)。  
            $request->setPathInfo('message/pros');  
        });  
    }  
}  
此条目发表在yii2分类目录。将固定链接加入收藏夹。