<p>原文地址:http://ivhong.com/?p=108(ivhong.com 是我的博客主址)</p><div>
</div>yii2 可以使用事件机制来触发特殊的处理,实现了代码扩展,可以理解为在yii2内核层已经埋下了隐藏的“钩子”,用于后期扩展,比如 yii\base\application::run() 方法就埋下了两个“钩子”
// yii\base\Application
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');
});
}
}
PS: 本函数仅用作测试使用,这样修改后,所有的路径都会被指向控制器 'message/pros'。