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

标签 symfony

我是 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/

相关文章:

symfony - 实体可以存储在其他位置而不是实体目录中吗?

php - 如何在 symfony2 中设置主键变量

mysql - 如何在单个字段中存储多个选择值 Symfony2

php - 如何在 2 个实体之间使用 QueryBuilder 在 Symfony Doctrine 中没有关系表的情况下加入

node.js - 如何使用nodejs验证Symfony2 sha512密码

php - 如何避免在 Symfony Messenger 中处理来自 "child"类的消息?

symfony - 如何根据对象 Sonata Admin 删除路由

symfony2.7 在服务容器中传递翻译器

php - 预期的字符串类型参数,给定的对象 - Symfony2

php - 哪个 Symfony 环境变量在哪个文件中可用(.env、.env.local 等)?