Symfony 2 でのコマンド ラインの作成に関するドキュメントを読みました。少し違うコマンド クラスを作成したかったのです。確かに、翻訳者をクラスのプライベートフィールドとして追加したい...次のように:
<?php
namespace myVendor\myBundle\Command;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class ThemeCommand extends ContainerAwareCommand {
private $translator;
public function __construct() {
$this->translator = $this->getContainer()->get('translator');
}
protected function configure() {
$this->setName('viewkit:color')
->setDescription($this->translator->trans('command.theme.description'))
->addArgument('theme', InputArgument::REQUIRED, 'le thème jquery');
}
protected function execute(InputInterface $input, OutputInterface $output) {
$theme = $input->getArgument('theme');
$output->writeln($this->translator->trans('command.theme.success'));
}
}
?>
ご想像のとおり、コンストラクターが原因で機能しません。次の例外があります。
Call to a member function getKernel() on a non-object in C:\wamp\www\viewkit\vendor\symfony\symfony\src\Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand.php
問題は、おそらく null を返す抽象クラスContainerAwareCommandのgetContainerメソッドです。このクラスはCommand.phpクラスに由来するため、問題はより具体的には、非オブジェクト (おそらく null) を返すCommand.php getApplicationメソッドです。
どういうわけか、Command.php クラスのアプリケーションフィールドがいっぱいになりましたが、 ThemeCommandにコンストラクターがあるため、問題があります。
だから私の質問は: ThemeCommand クラスにプライベートフィールドを持ち、よくできたコンストラクターでそれらを初期化するにはどうすればよいですか?
ありがとうございました
コンストラクターを取り除き、ドキュメントのように別のテストを行いました...同じ問題、コンストラクターは問題ではありませんが、Command.phpのgetApplicationがnullであるため、getContainerはオブジェクトを返しません