【已解决】webman控制器构造函数中依赖注入默认是单例,无法设置非单例

wangerwu

如果在方法index注入是重新创建实例,但是通过构造引入则是单例怎么回事。

控制器复用已关闭,目前的解决方案是,控制器构造传工厂创建。

IndexController.php

<?php

namespace app\controller;

use app\TestInterface;

class IndexController
{
    private TestInterface $test;

    public function __construct(TestInterface $test)
    {
        $this->test = $test;
    }

    public function index()
    {
        var_dump('控制器 index()');
        return $this->test->get();
    }
}

dependence.php

<?php

use app\Test;
use app\TestInterface;

return [
    TestInterface::class => \DI\autowire(Test::class),
];
345 3 1
3个回答

小Z先生

试试 dependence.php 这样写

<?php

use app\Test;
use app\TestInterface;

return [
    TestInterface::class => function(){
        return new Test();
    },
];
nitron

https://www.workerman.net/doc/webman/controller.html#%E6%8E%A7%E5%88%B6%E5%99%A8%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F

控制器生命周期
每个控制器每个进程只会实例化一次,多个进程实例化多次(关闭控制器复用除外,参见控制器生命周期)
控制器实例会被当前进程内多个请求共享(关闭控制器复用除外)
控制器生命周期在进程退出后结束(关闭控制器复用除外)

  • wangerwu 2024-10-25

    控制器复用已关闭的。问题是方法获取是新实例,唯独构造是单例。

  • nitron 2024-10-25

    改了配置要重启

  • wangerwu 2024-10-25

    控制器复用一直是关闭的,runtime也清除过。

  • wangerwu 2024-10-25

    重新创建一个webman项目,测试发现也是这个问题。

  • nitron 2024-10-25

    @walkor

walkor 打赏

这个要挖下PHP-DI的源码,猜测是 dependence.php 定义的依赖都是单例

  • wangerwu 2024-10-25

    老哥,通过控制器方法注入是新实例,控制器构造是单例,有点搞不明白。
    如果php-di设为单例,控制器方法也是单例,控制器方法的注入是如php-di预期一致的,php-di设置单例就是单例,非单例就是非单例,

    唯独控制器构造是单例,怎么做都是单例。

  • wangerwu 2024-10-25

    控制器方法的注入是如php-di预期一致的,唯独构造,怎么做都是单例。

  • walkor 2024-10-25

    看到问题标记已解决,所以问题是?解决方法是?

  • wangerwu 2024-10-25

    想着不打扰你们了,干脆用工厂来创建。昨天已经折腾半天了,大家提出的都试过。谢谢老哥

×
🔝