gpt4 book ai didi

symfony - 如何从控制台参数设置配置参数?

转载 作者:行者123 更新时间:2023-12-04 08:50:37 25 4
gpt4 key购买 nike

我是 Symfony 的新手。

我试图通过控制台参数 'format=json' 更改 Monolog 输出格式化程序。

简而言之,我想通过以下方式运行任何控制台命令:

app/console my_command --format=json # xml / txt / my own

...并以请求的格式获取 LoggerInterface 的输出。

例如,我在配置中设置了默认格式化程序:
monolog:
handlers:
console:
type: console
channels: [!event, !doctrine]
formatter: json_formatter
services:
json_formatter:
class: Monolog\Formatter\JsonFormatter

当我创建一些 MyEventListener::onConsoleCommand ( as described here ) 时,我无法更改参数包,因为它已经编译:“无法在卡住的 ParameterBag 上调用 set()”。

Up2:在这种情况下,我的服务配置如下所示:
services:
kernel.listener.command_dispatch:
class: My\Listener\MyEventListener
autowire: true
tags:
- { name: kernel.event_listener, event: console.command }

用另一种方式,我可以在初始文件中注册控制台选项:
# app/console
$loader = require __DIR__.'/autoload.php';
# ...
$application->getDefinition()->addOption(
new InputOption(
'formatter',
'f',
InputOption::VALUE_OPTIONAL,
'The logs output formatter',
'json_formatter'
)
);

但是我找不到在容器中更改参数包的方法。因为 $application->getKernel()->getContainer() 还是空的。

那么,如何从控制台输入更改 Symfony2 参数?

或者,也许我可以只使用一些环境参数?但是如何在 YAML 配置中获取环境变量?

谢谢你。

UP3:
我已经通过这样的环境变量实现了目标:
SYMFONY__LOG__FORMATTER=json_formatter app/console my_command
monolog:
handlers:
console:
type: console
#...
formatter: '%log.formatter%'

最佳答案

为应用程序的每个注册命令修改命令参数的唯一要点是处理 CommandEvents::COMMAND触发 之前 任何命令已被执行。所以你可以修改它的参数并按照 here 的描述阅读它们。 .此外,此时您已经编译了容器,此时无法修改服务的定义。但是您可以获得任何服务。

所以我认为你最终可以得到以下处理程序:

class LogFormatterEventListener
{
private $container;
private $consoleHandler;

public function __construct(ContainerInterface $container, HandlerInterface $consoleHandler)
{
$this->container = $container;
$this->consoleHandler = $consoleHandler;
}

public function onConsoleCommand(ConsoleCommandEvent $event)
{
$inputDefinition = $event->getCommand()->getApplication()->getDefinition();

$inputDefinition->addOption(
new InputOption('logformat', null, InputOption::VALUE_OPTIONAL, 'Format of your logs', null)
);

// merge the application's input definition
$event->getCommand()->mergeApplicationDefinition();

$input = new ArgvInput();

// we use the input definition of the command
$input->bind($event->getCommand()->getDefinition());

$formatter = $input->getOption('logformat');
if ($formatter /** && $this->container->has($formatter) **/) {
$this->consoleHandler->setFormatter(
$this->container->get($formatter);
);
}
}
}

关于symfony - 如何从控制台参数设置配置参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39076444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com