Thinkphp6前置中间件获取不到$request->controller() 控制器名称 解决方案

本文讲述了在Thinkphp6的多应用模式下,如何解决由于前置中间件的限制导致无法在`handle()`中获取控制器名称的问题,通过在对应应用目录的`config/route.php`中配置middleware来实现。需注意避免在全局和应用级中间件中注册这些依赖控制器名称的前置中间件。

学习引用大神方法:https://www.jianshu.com/p/e1d8f5b7dcdf

1、Thinkphp6 在多应用模式下,使用前置中间件的方法 handle() 下 无法使用 $request->controller() 获取到控制器名称
里插入图片描述
2、解决办法,在对应的 应用目录下创建 配置文件 config/route.php 配置 middleware 解决

<?php
//使用config 配置应用中间件 解决 前置中间件 无法获取控制器名称 问题
return [
    'middleware'=>[
        \app\demo\middleware\Auth
<think>好的,我现在要回答用户关于ThinkPHP 3.1中$this->get()和$this->_get的区别,以及应该使用哪个来获取URL提交的GET数据的问题。首先,我需要回忆一下ThinkPHP 3.1的版本中这两个方法的定义和用途。 首先,ThinkPHP 3.1是一个比较旧的版本,现在可能已经不常用了,但用户的问题仍然需要准确回答。根据之前的了解,ThinkPHP框架中的控制器方法通常使用魔术方法来处理输入数据。例如,get()方法可能用于获取GET请求的数据,而$_GET则是PHP超全局变量。 不过用户提到的是$this->get()和$this->_get,这可能涉及到框架封装的方法与直接访问超全局变量的区别。在ThinkPHP中,为了安全性和统一处理,通常会提供一些方法来过滤和获取输入数据,而不是直接使用$_GET、$_POST等。 可能$this->get()是框架提供的一个方法,用于安全地获取GET参数,经过过滤处理,防止注入攻击等。而$this->_get可能是一个魔术方法或者直接访问超全局变量$_GET的别名。需要确认这两个方法的具体定义和用途。 接下来,我需要查阅ThinkPHP 3.1的文档或者源码,确认这两个方法的定义。例如,在控制器中,get()方法可能被定义为处理GET请求参数,可能带有过滤功能。而$_get可能是一个魔术方法,比如通过__get方法动态获取输入数据,或者直接返回$_GET数组中的值。 例如,框架可能在控制器基类中定义了get()方法,用于获取特定参数,并进行过滤。而$_get可能是一个属性,或者通过__get方法访问时,返回原始的$_GET数据。这时候,使用$this->get()可能更安全,因为它可能自动处理了过滤,而直接使用$_get可能会得到未经处理的原始数据,存在安全风险。 另外,需要注意在PHP中,如果类中有__get魔术方法,当访问未定义的属性时会触发,这可能被用来动态获取输入数据。例如,如果访问$this->_get('param'),可能底层会从$_GET中获取,同时进行一些处理。 但用户的问题中是$this->_get,可能是一个方法还是属性呢?这里需要明确。例如,可能在框架中,$this->_get是一个方法,如M方法或者D方法一样,是框架的封装。 比如,ThinkPHP 3.1的控制器可能有类似_get方法,用于获取GET参数,而get()方法可能用于输出数据或者有其他用途?或者可能相反? 这里可能需要进一步确认。例如,在ThinkPHP中,可能常见的用法是使用M方法或者D方法来实例化模型,而获取输入数据通常使用I方法,或者通过魔术方法直接访问。 例如,在ThinkPHP中,获取输入数据常用I方法,如I('get.param_name'),这样可以指定过滤方式。但用户的问题是关于$this->get()和$this->_get,这可能涉及到控制器中的特定方法。 假设在ThinkPHP 3.1中,$this->get()可能是一个输出方法,比如输出变量到模板,而$this->_get()获取GET参数的方法。或者可能存在混淆,比如在控制器中,get操作方法用于处理GET请求,而$_get可能是一个辅助方法。 或者,可能$this->get()是用于获取模型或者实例的,而获取GET数据应该用其他方式。这时候可能需要更仔细地分析。 这时候可能需要参考官方文档或者源码。例如,在ThinkPHP 3.1的控制器基类中,是否有定义get()方法?或者是否有使用__get方法来处理输入? 比如,查看ThinkPHP 3.1的源码,在Action类中,可能有处理输入的方法。例如,框架可能使用了魔术方法__get来直接返回GET或POST的数据,这样访问$this->param就会从$_GET或$_POST中获取。 例如,在Action类中,可能会有这样的代码: public function __get($name) { return $_GET[$name]; } 这样,当访问$this->param时,就会自动从$_GET中获取。但这样的实现可能存在安全问题,所以可能框架有更安全的处理方式。 而关于$this->get()方法,可能是一个普通方法,用于处理特定的GET参数,或者返回所有GET数据。而$this->_get可能是一个受保护的方法或属性,用于内部获取数据。 不过,由于用户的问题可能涉及到具体版本的实现,我需要更准确的信息。例如,在ThinkPHP 3.1中,可能并有$this->get()这样的方法,而更多使用I函数来获取输入数据。例如,I('get.')用于获取所有GET参数,或者I('get.param')获取特定参数,并可以指定过滤方法。 这时候用户的问题可能是因为在代码中看到两种不同的用法,所以需要明确区别。 可能在ThinkPHP 3.1中,$this->get()并不是一个标准的方法,而可能是用户自己定义的方法,或者可能是对I函数的封装。而$this->_get可能也是类似的封装。这种情况下,需要根据框架的实际情况来判断。 如果用户的问题是基于框架的标准方法,可能需要重新考虑。例如,在官方文档中,获取GET参数的标准方式是使用I('get.')或者I('param_name','','get'),这时候$this->get()可能是一个封装了I函数的方法,而$this->_get可能直接访问$_GET。 例如,可能$this->get($name)内部调用了I('get.'.$name),而$this->_get可能直接返回$_GET[$name]。 这时候区别就在于,使用$this->get()可能更安全,因为经过了I函数的过滤机制,而$this->_get可能直接获取原始数据,可能存在安全风险。 总结可能的区别: 1. $this->get()可能是框架封装的方法,用于安全地获取GET参数,经过过滤处理。 2. $this->_get可能是直接访问$_GET数组,或者是一个未经过滤的获取方法。 因此,获取URL提交的GET数据应该使用经过过滤的方法,如$this->get(),以确保安全,防止注入攻击等。 不过,如果框架中有这样的标准方法,用户可能需要使用I函数。例如,在控制器中,I('get.param')。 这时候可能用户的问题中的$this->get()和$this->_get是特定项目中的封装方法,而不是框架原生的方法。例如,开发者可能定义了get方法来包装I函数的调用,而$_get可能直接访问超全局变量。 综上,正确的做法是使用框架提供的过滤方法,如I函数,或者封装好的方法,而不是直接访问$_GET。因此,用户应该使用$this->get()(如果该方法封装了安全处理),而不是$this->_get。 最后,用户的问题需要确认这两个方法的来源和定义,但根据常规的框架设计,使用封装后的方法更安全。</think>在ThinkPHP 3.1中,`$this->get()`和`$this->_get`的区别如下: 1. **`$this->get()`** 通常是框架封装的**安全获取方法**,内部可能调用`I()`函数(如`I('get.param_name')`),支持数据过滤和自动转义,防止SQL注入或XSS攻击。例如: ```php $username = $this->get('username'); // 可能自动过滤非法字符 ``` 2. **`$this->_get`** 通常直接访问PHP超全局变量`$_GET`,**未经过滤**,存在安全风险。例如: ```php $username = $this->_get['username']; // 直接获取原始数据 ``` **获取URL提交的GET数据应使用`$this->get()`**,因为它通过框架封装实现了安全处理,而直接使用`$_GET`可能导致数据污染或攻击漏洞。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值