You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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类:

  1. 创建自定义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;
}
  1. 修改服务配置
    打开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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:23:09