升级PHP 8.1后,在CodeIgniter的Filter中向请求传递额外数据的正确实现方式
升级PHP 8.1后,在CodeIgniter的Filter中向请求传递额外数据的正确实现方式
嗨,我完全懂你碰到的这个麻烦——PHP 8.1开始严打动态创建类属性,直接给Request对象加user_id确实会触发警告,而且改vendor文件夹里的文件真的是大忌,框架一更新你的修改就没了,太不稳了。
其实CodeIgniter本身就给咱们留了合法的路子来传递这类自定义数据,给你两个靠谱的解决方案:
方案一:用Request内置的属性存储方法(轻量首选)
CodeIgniter的Request对象自带专门存自定义属性的方法,根本不用动态加属性。你只需要把原来的$request->user_id = $user['id'];改成:
$request->setAttribute('user_id', $user['id']);
之后在控制器里取这个值的时候,用:
$userId = $request->getAttribute('user_id');
这种方法不用改任何框架核心或配置,拿来就能用,特别适合临时传少量自定义数据的场景。
方案二:自定义Request类(适合多属性场景)
如果你的项目需要给Request加好几个自定义属性,或者想保留原来直接访问的语法(比如$request->user_id),可以自己写个Request类:
- 创建自定义Request类
在app/HTTP目录下新建Request.php文件,内容如下:
<?php namespace App\HTTP; use CodeIgniter\HTTP\Request as BaseRequest; class Request extends BaseRequest { // 预先定义user_id属性,避开动态属性警告 public ?int $user_id = null; }
- 修改服务配置
打开app/Config/Services.php,找到request方法,改成返回咱们自定义的Request类:
public static function request(bool $getShared = true) { if ($getShared) { return static::getSharedInstance('request'); } $config = config('App'); return new \App\HTTP\Request( \Config\Services::uri(), 'php://input', [], $_COOKIE, $_FILES, $_SERVER ); }
改完之后,你就可以像PHP 7.x时代那样直接给$request->user_id赋值了,完全符合PHP 8.1的规范,不会有任何警告。
两种方案都能完美解决你的问题,根据自己的需求选就行~
备注:内容来源于stack exchange,提问作者Dusan
相关产品推荐
相关产品推荐

