我正在添加新的命令行。我想访问类中的参数值(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;
}
我有一个警告说,第一个参数丢失。在Command母类中,有一个名称,然后是构造函数的唯一参数,尽管我写了:
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时,我遇到了同样的问题。 This blog post很好地说明了这一点。如果您使用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');
// ...
}
}