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'); }); } }