2016-08-18 4 views
1

最初に、設定コンソールアプリケーションで私を助けてください - コンフィグautowireコマンドでコンソールアプリケーションを設定する方法は?

#!/usr/bin/env php 
<?php 
use .... 
... 
$container = new ContainerBuilder(); 
$config = new YamlFileLoader($container, new FileLocator(__DIR__)); 
$config->load('config.yml'); 
$output = $container->get('symfony.console_output');$logger = $container->get('logger'); 
//I want automatic injection!!!! 
$helloCommand = new HelloCommand($container, $logger); 
$application = $container->get('symfony.application'); 
$application->add($helloCommand); 
$application->run(null, $output); 

そして、私のconfig.yml

services: 
logger: 
    class: Symfony\Component\Console\Logger\ConsoleLogger 
    arguments: 
     - '@symfony.console_output' 
symfony.application: 
    class: Symfony\Component\Console\Application 
    calls: 
     //by this variant autowire not working 
     - [add, [ '@app.command.hello_command' ]] 
     - [setDispatcher, ['@symfony.event_dispatcher']] 
... 
app.command.hello_command: 
    class: App\Command\HelloCommand 
    autowire: true 
    tags: 
     - { name: console.command } 

だから私HelloCommandがContainerInterfaceとLoggerInterfaceとのコンストラクタを持っており、私はこれを設定した場合にのみ、それが動作引数が直接、他の人が間違ったコンストラクタに関するエラーが発生しました

config.ymlを使用したコンフィグレーションの別の方法が存在する可能性があります。 はロガーのみです。セット['@logger' ]を引数として使用しますが、現在のコンテナを引数としてどのように設定できますか? それともhttpkernelでいっぱいにsymfonyをインストールする必要がありi`ll(それは必要ありません)

HelloCommand http://pastebin.com/VRr3FM7Q

DECISION

app.command.hello_command: 
class: App\Command\HelloCommand 
arguments: 
     - '@service_container' 
     - '@logger' 
tags: 
    - { name: console.command } 
+0

サービスとして登録しようとすると、なぜあなたは手動で 'HelloCommand'のオブジェクトを作成しますか? 'HelloCommand'クラスのコードも表示してください。 – xabbuh

+0

代替バリアント。もし私が初期化を使って手動で作成しても構いませんが、設定注入がうまくいかない場合は、 – Lenny

+0

HelloCommand http://pastebin.com/VRr3FM7Q – Lenny

答えて

2

問題は、設定方法にありあなたのコマンド:

app.command.hello_command: 
    class: App\Command\HelloCommand 
    autowire: true 
    tags: 
     - { name: console.command } 

これは、必要な2つのコンストラクタ引数、つまり$container$loggerを失い、おそらく例外が発生します。次のようにコンストラクタ引数を追加できます。

app.command.hello_command: 
    class: App\Command\HelloCommand 
    arguments: 
     - '@service_container' 
     - '@logger' 
    [...] 

service_containerのIDが正しいかどうかわかりません。私はコンテナを渡したり、物事をContainerAwareにすることはありませんが、あなたは一般的な考え方を得ます。 ;)

+0

これは言うまでもないことです。問題はコンテナIDを指定する方法を知らないという事実にあります – Lenny

+0

しかし '@service_container' - 正しいです! app.phpで手作業で定義されていないすべての作品は大変感謝しています! – Lenny

+0

私はautowireがサービスファイルの引数セクションを明示的に定義する必要性を排除することを期待していました。コマンドのコンストラクタに引数を正しく入力しましたか? – Cerad

関連する問題