扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
把某个基于thinkphp5.0的项目迁移到thinkphp6,发现很多后台提交环节都报错了,原因在于进行提交的时候后台接收到的参数多出了一个url key,而一些简单的操作直接把收到的字段更新到数据表,就很可能报数据表字段不存在。
对于post操作,我们可以通过获取post数据,就没有这个参数。但是如果通过param、get等方式获取参数(实际上很多场景需要用到),就会多了上面那个参数。在不不过多修改源代码的前提下如何快速过滤掉这个参数呢?下面提供两种方式:
1、修改伪静态配置文件
以apache为例,我们可以发现thinkphp5.0和thinkphp6的伪静态配置文件.htaccess有一点不一样,就是在最后一行不一样。thinkphp5.0的默认.htaccess内容如下:
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1] </IfModule>
而thinkphp6的默认.htaccess内容如下:
<IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L] </IfModule>
如果实测可以知道,只要把老版本默认的.htaccess最后一行覆盖thinkphp6默认的.htaccess的最后一行即可,也就是
RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
改成
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
即可。
2、直接在应用中进行参数过滤
除了修改伪静态配置文件,我们还可以通过手写业务逻辑代码快速过滤掉对应多余的key参数。由于这个老项目获取项目是使用input助手函数,下面我们就以input助手函数过滤为例。我们可以在app\Resquest.php添加如下代码:
public function input(array $data = [], $name = '', $default = null, $filter = ''){ $data = parent::input($data,$name,$default,$filter); if(is_array($data)){ reset($data); $firstKey = key($data); if(substr_count($firstKey, '/')>0){ array_shift($data); } return $data; } return $data; }
当然也可以通过get、post、param等方式进行过滤,对应的代码,可以参考vendor\topthink\framework\src\think\Request.php文件中对应方法,进行重写来进行过滤;这个类文件是tp框架关于请求相关的核心类。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流