如果在方法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),
];
试试 dependence.php 这样写
没用,试过了。
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
控制器生命周期
每个控制器每个进程只会实例化一次,多个进程实例化多次(关闭控制器复用除外,参见控制器生命周期)
控制器实例会被当前进程内多个请求共享(关闭控制器复用除外)
控制器生命周期在进程退出后结束(关闭控制器复用除外)
控制器复用已关闭的。问题是方法获取是新实例,唯独构造是单例。
改了配置要重启
控制器复用一直是关闭的,runtime也清除过。
重新创建一个webman项目,测试发现也是这个问题。
@walkor
这个要挖下PHP-DI的源码,猜测是 dependence.php 定义的依赖都是单例
老哥,通过控制器方法注入是新实例,控制器构造是单例,有点搞不明白。
如果php-di设为单例,控制器方法也是单例,控制器方法的注入是如php-di预期一致的,php-di设置单例就是单例,非单例就是非单例,
唯独控制器构造是单例,怎么做都是单例。
控制器方法的注入是如php-di预期一致的,唯独构造,怎么做都是单例。
看到问题标记已解决,所以问题是?解决方法是?
想着不打扰你们了,干脆用工厂来创建。昨天已经折腾半天了,大家提出的都试过。谢谢老哥