yii2 随笔(六)利用事件触发修改请求参
2016-03-23 20:27
741 查看
<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'。
相关文章推荐
- PHP解决约瑟夫环的问题
- PHP去除字符串中的空白字符和特殊字符
- thinkphp框架中的验证码使用及验证码刷新
- 利用PHPExcel转Excel柱形图
- 无需密码直接ssh或sftp到另外一个服务器的方法
- PHP基础知识
- matplotlib画图
- PHP中检索字符串
- zabbix3.0在php7环境下always_populate_raw_post_data的设置
- php 理解
- file的getPath getAbsolutePath和getCanonicalPath的不同
- 学习Discuz! X3.2记录:一个小提示,可以知道插件php文件语法出问题了
- 中介PHP连接前台HTML与数据库MySQL
- PHP 购物车 php闭包 array_walk
- Scala、PHP、Golang 二分法查找
- yii2实现数据分页显示
- 文件传输导致PHP-smarty白屏故障
- PHP核心技术与最佳实践——总结
- Setting下增加触摸笔功能(TP)
- Thinkphp3.2.3 解决关联模型的自动生成问题($_auto)