29

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

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

//config.yml

imports:
- { resource: services.yml }

//服务.yml

services:
  less_css_compiler:
    class: MyVendor\MyBundle\Command\ThemeCommand
    arguments: [%less_compiler%]

//参数.yml

parameters:
    less_compiler:     WinLess.exe

据说通常参数在类的构造函数中,但如果我这样做:

public function __construct($less_compiler) {
    $this->less_compiler = $less_compiler;
}

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

 public function __construct($name, $less_compiler) {
 }

它不会改变任何东西..

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

$service = $this->getContainer()->get('less_css_compiler');

但我如何得到论点?

谢谢

4

2 回答 2

39

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

$this->getContainer()->getParameter('parameter_name');

或者

您应该创建单独的服务类

$service = $this->getContainer()->get('less_css_compiler');

//服务.yml

services:
  less_css_compiler:
    class: MyVendor\MyBundle\Service\LessCompiler
    arguments: [%less_compiler%]

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

public function __construct($less_compiler) {
    $this->less_compiler = $less_compiler;
}

从命令类调用服务。

而已。

原因:您将命令类本身作为服务,位命令类构造器期望命令名称作为第一个参数。

于 2013-03-26T12:29:58.783 回答
21

我在使用 Symfony 4.4 时遇到了同样的问题。这篇博文很好地解释了这一点。如果您使用自动装配,只需更新您的代码,如下所示:

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');
        // ...
    }
}
于 2020-01-11T11:22:38.130 回答