1

我有一个 PHP 命令行实用程序,执行如下:

tool plugin command [options]...

这个想法是可以使用 3rd 方插件,因此主要工具不知道它们是什么。它可以通过环境变量找到它们,就像PATH.

主工具应用程序有一个组合根,其中包含所有插件(共享)使用的依赖项。但是,每个插件都有自己的依赖项,因此,插件的构造函数是我拥有第二个组合根的地方。

这听起来像是多个组合根的合理案例吗?

$c = new DIContainer();
$c->bind(...); // whatever is needed
$loader = new PluginLoader($c);

// argv[1] is the plugin name. the loader will inject the Container
// into the plugin's constructor. This is the 2nd composition root
$plugin = $loader->get($argv[1]);// locates and constructs

// the plugin populates its commands as plugin.command
$cmd = $c[ $argv[1] . '.' . $argv[2] ];

$cmd->execute(array_splice($argv, 3));

第二个问题

每个命令都有一个 Option 对象数组,我不确定 Command 是否应该预先组合和注入这个数组,或者是否应该将 OptionFactory 注入到命令的构造函数中。后者很好,因为它将选项封装在命令中,而插件的构造函数必须为它支持的每个命令构建一个选项列表。请注意,这些不是命令行选项 ( $argv),它只是命令支持的选项列表并包括一个验证器。

// Plugin class, 2nd composition root, called by PluginLoader
class MyPlugin{
  public function __construct(Container $c){
    $c->bind('myplugin.command', function(Container $c){
      return new Command([ ... create option objects here ...]);
      // or
      return new Command($c['option-factory']); // let cmd build option[]
    });
  }
}
4

0 回答 0