新しいコマンドラインを追加しています。クラスのパラメーター(parameters.yml)の値にアクセスしたいのですが。
パラメータにアクセスするには、このクラスをサービスとして追加する必要があることを読みました。そう
//config.yml
imports:
- { resource: services.yml }
//services.yml
services:
less_css_compiler:
class: MyVendor\MyBundle\Command\ThemeCommand
arguments: [%less_compiler%]
//parameters.yml
parameters:
less_compiler: WinLess.exe
通常、引数はクラスのコンストラクタにあると言われていますが、これを行うと:
public function __construct($less_compiler) {
$this->less_compiler = $less_compiler;
}
最初の引数が欠落しているという警告があります。コマンドマザークラスには、コンストラクタの一意の引数として名前がありますが、私が書いたとしても、
public function __construct($name, $less_compiler) {
}
何も変わりません。
他の可能性は私のクラス内のサービスを呼び出すことです:
$service = $this->getContainer()->get('less_css_compiler');
しかし、どうすれば引数を取得できますか?
ありがとうございました
簡単な方法、コマンドでContainerAwareCommandを拡張する
$this->getContainer()->getParameter('parameter_name');
または
別のサービスクラスを作成する必要があります
$service = $this->getContainer()->get('less_css_compiler');
//services.yml
services:
less_css_compiler:
class: MyVendor\MyBundle\Service\LessCompiler
arguments: [%less_compiler%]
サービスクラスで、上記のようなコンストラクタを作成します
public function __construct($less_compiler) {
$this->less_compiler = $less_compiler;
}
コマンドクラスからサービスを呼び出します。
それでおしまい。
理由:コマンドクラス自体をサービスとして作成しています。ビットコマンドクラスのコンストラクターは、最初の引数としてコマンド名を想定しています。
Symfony 4.4を使用するときにも同じ問題が発生しました。 このブログ投稿 はそれを非常によく説明しています。 autowire を使用する場合は、以下のようにコードを更新してください:
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class MessageGenerator
{
private $params;
public function __construct(ParameterBagInterface $params)
{
$this->params = $params;
}
public function someMethod()
{
$parameterValue = $this->params->get('parameter_name');
// ...
}
}