从Command Class访问参数

mlw*_*mos 24 parameters service symfony

我正在添加一个新的命令行.我想在我的类中访问参数(parameters.yml)的值.

我读到我应该将此类添加为服务以访问该参数.所以

//config.yml

imports:
- { resource: services.yml }
Run Code Online (Sandbox Code Playgroud)

//services.yml

services:
  less_css_compiler:
    class: MyVendor\MyBundle\Command\ThemeCommand
    arguments: [%less_compiler%]
Run Code Online (Sandbox Code Playgroud)

//parameters.yml

parameters:
    less_compiler:     WinLess.exe
Run Code Online (Sandbox Code Playgroud)

据说,正则论证是在类的构造函数中,但如果我这样做:

public function __construct($less_compiler) {
    $this->less_compiler = $less_compiler;
}
Run Code Online (Sandbox Code Playgroud)

我有一个警告说第一个参数丢失了.在Command母类中有一个名称作为构造函数的唯一参数,但即使我写:

 public function __construct($name, $less_compiler) {
 }
Run Code Online (Sandbox Code Playgroud)

它没有改变任何东西..

其他可能性是调用我班级内的服务:

$service = $this->getContainer()->get('less_css_compiler');
Run Code Online (Sandbox Code Playgroud)

但是我怎么得到这个论点呢?

谢谢

Ven*_*enu 35

简单的方法,让命令扩展ContainerAwareCommand

$this->getContainer()->getParameter('parameter_name');
Run Code Online (Sandbox Code Playgroud)

要么

您应该创建单独的服务类

$service = $this->getContainer()->get('less_css_compiler');
Run Code Online (Sandbox Code Playgroud)

//services.yml

services:
  less_css_compiler:
    class: MyVendor\MyBundle\Service\LessCompiler
    arguments: [%less_compiler%]
Run Code Online (Sandbox Code Playgroud)

在服务类中,创建上面提到的构造函数

public function __construct($less_compiler) {
    $this->less_compiler = $less_compiler;
}
Run Code Online (Sandbox Code Playgroud)

从命令类调用服务.

而已.

原因:您将命令类本身作为服务,位命令类构造函数需要将命令名称作为第一个参数.

  • 创建服务只是为了访问parameters.yml中的参数真的很干净...也许还有另一种方法,但使用服务? (3认同)
  • 当然是的,$ this-> getContainer() - > getParameter('parameter name'); (2认同)
  • 请注意,由于自 Symfony 4.2 以来版本 2.4 已被弃用以扩展 ContainerAware @deprecated,因此请使用 {@see Command} 代替 (2认同)

Str*_*bek 18

我在使用 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');
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)