web-dev-qa-db-ja.com

Symfony 2コンソールコマンドでサービスコンテナを取得すると、「非オブジェクトでgetKernel()」が表示されます

configure()関数で、サービスコンテナを取得しようとしました

_class SetQuotaCommand extends ContainerAwareCommand {

    protected function configure() {
        parent::configure();
        die(get_class($this->getContainer()));
_

PHP Fatal error: Call to a member function getKernel() on a non-object in ...\Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand.php on line 37

何か違うことをする必要がありますか?

[〜#〜]更新[〜#〜]

execute()getContainerを呼び出すと機能することに気づきました。しかし、getContainer()configure()を実行できるかどうか疑問に思います。 addOptionデフォルト値引数で使用する構成パラメーターを取得したい。

そうでなければ私は使うことができます

_$param1 = $input->getOption('param1') ? : $container->getParameter('param1'); 
_

どちらが少し直感的ではないように見えますか?

12
Jiew Meng

サービスコンテナがconfigureで初期化されていないようです。 executeでアクセスできます。

コンソールオプションのデフォルトについては、次のようなものを使用できます

$opt1 = $input->getOption('opt1') ? : $default;

多くの場合、Symfony2では、パラメーター/変数を取得するときにデフォルト値を設定できます。したがって、上記のソリューションのショートカットは次のようになります。

$opt1 = $input->getOption('opt1', $default);

これを答えとして置くだけなので、他に答えがない場合はこれを閉じることができます。

2
Jiew Meng

Execute()で$this->container = $this->getApplication()->getKernel()->getContainer();を呼び出します。 https://stackoverflow.com/a/7517803/297679 を参照してください

20
Nobu

私がグーグルで見つけたすべての情報(このスレッドを含む)にもかかわらず、何も機能していないようです。カーネルを入手できなかった理由がついにわかりました。

ドキュメントからの1:1コピーで、ファイルapplication.phpを作成しました。

#!/usr/bin/env php
<?php
// application.php

require __DIR__.'/vendor/autoload.php';
require __DIR__.'/app/AppKernel.php';

use X\SnmpBundle\Command\GreetCommand;
use Symfony\Component\Console\Application;

$application = new Application();
$application->add(new GreetCommand());
$application->run();

次に、以下を実行してアプリケーションを実行します。

./application.php this:thatまたはphp application.php this:that

これは私にはうまくいきませんでした。何らかの理由で、これを行うときにカーネルが使用できません。ただし、次を使用してアプリケーションを実行する場合です。

php app/console this:that

私の推測では、app app/consoleを実行すると、カーネルの起動など、application.phpよりもはるかに多くのことが実行されます。

アプリを「phpapp/console this:that」として実行すると、すべてが正常に機能し、次を使用できます。

$this->getContainer()->get('doctrine')->getManager();

それが私が必要としていたものでした。

2
Rudy Broersma