web-dev-qa-db-ja.com

コマンドクラスからパラメーターにアクセスする

新しいコマンドラインを追加しています。クラスのパラメーター(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');

しかし、どうすれば引数を取得できますか?

ありがとうございました

25
mlwacosmos

簡単な方法、コマンドで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;
}

コマンドクラスからサービスを呼び出します。

それでおしまい。

理由:コマンドクラス自体をサービスとして作成しています。ビットコマンドクラスのコンストラクターは、最初の引数としてコマンド名を想定しています。

36
Venu

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');
        // ...
    }
}
1
Strabek