2016-08-22 9 views
4

私はSymfonyの初心者です。コンソール引数からconfigパラメータを設定する方法は?

コンソール引数 '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()を呼び出してください。

アップ2:この場合、私のサービスの設定は次のようになります。

# app/console 
$loader = require __DIR__.'/autoload.php'; 
# ... 
$application->getDefinition()->addOption(
    new InputOption(
     'formatter', 
     'f', 
     InputOption::VALUE_OPTIONAL, 
     'The logs output formatter', 
     'json_formatter' 
    ) 
); 

しかし、私はできません。別の方法で

services: 
    kernel.listener.command_dispatch: 
     class: My\Listener\MyEventListener 
     autowire: true 
     tags: 
      - { name: kernel.event_listener, event: console.command } 

、私は最初のファイル内にconsoleオプションを登録することができますコンテナ内のパラメータバッグを変更する方法を見つける。 $ application-> getKernel() - > getContainer()はまだ空です。

したがって、コンソール入力からSymfony2パラメータを変更するにはどうすればよいですか?

また、いくつかの環境パラメータを使用できますか?しかし、YAML設定で環境変数をどのように得ることができますか?

ありがとうございます。

UP3: 私はこのような環境変数を使用して目標を達成している:ここで

SYMFONY__LOG__FORMATTER=json_formatter app/console my_command 
monolog: 
    handlers: 
     console: 
      type: console 
      #... 
      formatter: '%log.formatter%' 
+0

。いくつかのコードを追加して、それを試すことができますか? – Ziumin

+1

私はonConsoleCommandから変数をキャッチするのに問題はありません。この変種の主な問題は、onConsoleCommand()内で$ container-> setParameter( 'formatter'、 'json_formatter')を呼び出すことができないことです。 その問題のために: "固定ParameterBagでset()を呼び出すことはできません" – kivagant

+0

onConsoleCommand()バリアントの質問とサービス設定を更新しました。 – kivagant

答えて

1

唯一のポイントは、任意のコマンドが実行されてい前をトリガされCommandEvents::COMMANDを処理しているアプリケーションのすべての登録コマンドのコマンドの引数を変更します。したがって、引数を変更して、hereと記述したとおりに読むことができます。また、この時点でコンテナがコンパイルされており、この時点でサービスの定義を変更することはできません。しかし、あなたはどんなサービスも手に入れることができます。

だから私は、あなたが次のハンドラで終わることができると思う:onConsoleCommand`が最も便利な方法である `のように思え

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); 
      ); 
     } 
    } 
} 
+1

これについてmergeApplicationDefinitionは何も言わないとうまくいきません。 代わりに、$ event-> getCommand() - > getDefinition() - > addOption($ option)を実行できます。 これは、現在のコマンドにオプションを強制します。 そして、ContainerInterfaceの後にコンストラクタにConsoleHandler $ handlerを注入する方が良いです。 – kivagant

+0

ありがとうございます。私は記事のコードが正しいと仮定しました。また、コンテナをどこにでも注入するのを避けるべきだと私は同意しますが、ここでそれを行うのはちょっと難しくなります(利用可能なすべてのフォーマッタの配列も注入する必要があります)。 Btw、それは私が2番目のチェック 'container-> has($ formatter)'をコメントした理由です。 – Ziumin

+0

はい、フォーマッタについてはすべてOKですが、ConsuleHandlerを注入できます。 – kivagant

0

は(共通と互換性のある)の代替ソリューションです:

構成:

monolog: 
    handlers: 
     console: 
      type: console 
      channels: [!event, !doctrine] 
      formatter: "%log.formatter%" 
services: 
    json_formatter: 
     class: Monolog\Formatter\JsonFormatter 

C ommand実行:

# colored plain text 
app/console my_command 

# json 
SYMFONY__LOG__FORMATTER=json_formatter app/console my_command 
関連する問題