中间件中注入service类不成功

ric

问题描述

在中间件中,注入app\common\service\AuthService 类

用DI

#[Inject]
private AuthService $authService;

注入,报错

Typed property app\\common\\middleware\\Auth::$authService must not be accessed before initialization

变成只能new一个

public function __construct($data)
    {
        $this->data = $data;
        $this->authService = new AuthService();
    }

截图报错信息里报错文件相关代码

截图

422 2 0
2个回答

ric

好像Typed property app\common\service\AuthService::$authDao must not be accessed before initialization

通过中间件调用 AuthService 类, AuthService 类中通过

#[Inject]
private AuthDao $authDao;

调用AuthDao,也是失败的,而控制器中调用AuthService是正常的,也就是说通过中间件的所有业务流程中都不能使用DI,
有办法解决吗

  • ric 2023-09-15

    调用的看到了
    截图
    改为Container调用正常,但中间件中使用

    #[Inject]
    private AuthService $authService;

    依然不行

  • walkor 2023-09-15

    中间件实例化是在 vendor/workerman/webman-framework/src/App.php 的getCallback做的。你自己定位下吧

  • ric 2023-09-15

    之前有定位到的,考虑到是否实例化的时候也是通过new的而没有通过container,但发现代码是正确的

    foreach ($middlewares as $key => $item) {
                $middleware = $item[0];
                if (is_string($middleware)) {
                    $middleware = static::container($plugin)->get($middleware);
                } elseif ($middleware instanceof Closure) {
                    $middleware = call_user_func($middleware, static::container($plugin));
                }
                if (!$middleware instanceof MiddlewareInterface) {
                    throw new InvalidArgumentException('Not support middleware type');
                }
                $middlewares[$key][0] = $middleware;
            }

    所以暂时没有实际导致不能使用的原因

ric

@walkor 大佬指导下,有方案吗?

  • 暂无评论
🔝