应用插件中使用php-di 在plugin/插件/config/container.php中配置php-di容器 发现依赖注入未生效
只有将plugin/插件/config/container.php内容放到webman主系统/config/container.php中
php-di的依赖注入才生效
是不是应用插件不支持单独配置container 必须要在主系统container中配置
webman/config/container.php如下 默认
return new Webman\Container;
我的plugin/插件/config/container.php内容 如下
$builder = new \DI\ContainerBuilder();
$dependence = require __DIR__ . '/dependence.php';
$builder->addDefinitions($dependence, []);
$builder->useAutowiring(true);
$builder->useAttributes(true);
return $builder->build();
我的plugin/插件/config/dependence.php内容 如下
use plugin\kucoder\app\kucoder\lib\http\HttpInterface;
return [
HttpInterface::class => \DI\factory(function($container) {
return new \GuzzleHttp\Client();
}),
'http' => HttpInterface::class,
];
我的测试代码
use plugin\kucoder\app\kucoder\lib\http\HttpInterface;
use support\Container;
class TestController
{
public function index()
{
$http = Container::get(HttpInterface::class);
dump('容器实例化HttpInterface:', $http);
}
}
array:6 [
"msg" => "Class 'plugin\kucoder\app\kucoder\lib\http\HttpInterface' not found"
"code" => 0
"file" => "E:\php\webman\kc\vendor\workerman\webman-framework\src\Container.php"
"line" => 39
]
操作系统:windows 10
workerman:5.1.4
webman:2.1
算了 不在插件里做container容器配置了 都放在主系统container里做 如果多个插件都配置各自的container容器类 系统容器管理这块会不会冲突 感觉应用插件/config配置目录里 不适合放置container与dependence这两个插件容器配置文件 就是放在主系统里配置的话 后面升级webman有可能配置会被覆盖掉 需要备份
采用这种方法获取container 可以的 给你点赞
我知道为什么Container::get()这种方式获取不到插件的容器类了 在support\container类中的__callStatic方法中的如下代码
$plugin = \Webman\App::getPluginByClass($name); 这里有个bug 这里的$name是方法名 比如get make has 不是已注册的容器类路径 应该改成$plugin = \Webman\App::getPluginByClass($arguments[0]); 后 Container::get()这种方式就可以获取到插件的container了
$plugin = \Webman\App::getPluginByClass($arguments[0]);这种方式还是不太稳妥 比如Container::get('http')这种别名的方式 是怎么也找不到插件中注册的容器http别名的 可以用Container::get('插件名','http')这种方式 如果传递了第一个插件名参数,就直接去这个插件里找,如果没传插件名,只传递一个参数,再判断这个参数是字符串还是类::class路径