【发布时间】:2020-08-11 09:00:30
【问题描述】:
我已经开始使用 Symfony 的控制台组件来构建各种 cli 工具。
我目前正在拼凑这样一个控制台应用程序,它需要各种配置,其中一些在命令之间共享,其他配置是命令独有的。
一开始我使用了一个辅助类,通过一个静态函数调用来加载一个常规的配置数组。
昨天我重构了这个,现在在配置组件中加载配置,以及用于验证的 treeBuilder 机制。这一切都在主控制台脚本中完成,而不是在“命令”类中。
$app = new Application('Console deployment Application', '0.0.1');
/**
* Load configuration
*/
$configDirectories = array(__DIR__.'/config');
$locator = new FileLocator($configDirectories);
$loader = new YamlConfigLoader($locator);
$configValues = $loader->load(file_get_contents($locator->locate("config.yml")));
// process configuration
$processor = new Processor();
$configuration = new Configuration();
try {
$processedConfiguration = $processor->processConfiguration(
$configuration,
$configValues
);
// configuration validated
var_dump($processedConfiguration);
} catch (Exception $e) {
// validation error
echo $e->getMessage() . PHP_EOL;
}
/**
* Load commands
*/
foreach(glob(__DIR__ . '/src/Command/*Command.php') as $FileName) {
$className = "Command\\" . rtrim(basename($FileName), ".php");
$app->addCommands(array(
new $className,
));
}
$app->run();
目前,设置配置的唯一方法是将加载配置的代码设置在单独的类中,并在每个方法的 configure() 方法中调用该类。
也许我错过了一种更“symfonyish”的方式,我也想避免将整个框架放在代码库中,这意味着它是一个轻量级的控制台应用程序。
有没有办法使用 DI 或其他我不知道的方法将处理后的配置传递给正在调用的命令?
【问题讨论】:
-
您需要对某些/所有命令进行不同的配置吗?除了某些/所有命令中的配置之外,您还需要其他依赖项吗?如果你回答 2x 否,那为什么不
new $className($configuration)? -
@FaKeller - 我想我可以设法让所有命令使用相同的配置文件,并且不需要其他依赖项。我确实在这里找到了一个 DI 组件:github.com/luismulinari/consolefull 但这增加了不必要的依赖关系,我试图保持这一点。如果我理解正确,我可以做类似的事情: $application = new Application( 'Application name', 'Version', new ContainerConfig(); ); ?我刚刚进入 symfony 组件,如果您可以回复并详细说明一下,您的解决方案似乎符合我的目的。
标签: symfony symfony-2.1