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

7 篇文章 0 订阅

<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'。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值