应用插件配置文件container.php无效

hiwork

问题描述

应用插件中使用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
]

操作系统及workerman/webman等框架组件具体版本

操作系统:windows 10
workerman:5.1.4
webman:2.1

104 2 1
2个回答

hiwork

算了 不在插件里做container容器配置了 都放在主系统container里做 如果多个插件都配置各自的container容器类 系统容器管理这块会不会冲突 感觉应用插件/config配置目录里 不适合放置container与dependence这两个插件容器配置文件 就是放在主系统里配置的话 后面升级webman有可能配置会被覆盖掉 需要备份

  • 暂无评论
Container::instance('插件')->get(HttpInterface::class);
  • hiwork 2天前

    采用这种方法获取container 可以的 给你点赞

  • hiwork 1天前

    我知道为什么Container::get()这种方式获取不到插件的容器类了 在support\container类中的__callStatic方法中的如下代码
    $plugin = \Webman\App::getPluginByClass($name); 这里有个bug 这里的$name是方法名 比如get make has 不是已注册的容器类路径 应该改成$plugin = \Webman\App::getPluginByClass($arguments[0]); 后 Container::get()这种方式就可以获取到插件的container了

  • hiwork 1天前

    $plugin = \Webman\App::getPluginByClass($arguments[0]);这种方式还是不太稳妥 比如Container::get('http')这种别名的方式 是怎么也找不到插件中注册的容器http别名的 可以用Container::get('插件名','http')这种方式 如果传递了第一个插件名参数,就直接去这个插件里找,如果没传插件名,只传递一个参数,再判断这个参数是字符串还是类::class路径

🔝