如何在Symfony 4控制台命令中获取应用程序根路径

6

我有一个简单的Symfony 4控制台应用程序。在execute()方法中,我需要打印应用程序根目录路径。

这个$this->getContainer()->get('kernel')->getRootDir() - 不能工作。
这个$this->get('kernel')->getRootDir(); - 不能工作。
这个$this->get('parameter_bag')->get('kernel.project_dir'); - 不能工作。

如何获取应用程序的根目录路径?


使用 https://symfony.com/blog/new-in-symfony-4-1-getting-container-parameters-as-a-service 将其显式传递到控制台命令怎么样? - Robert
$this->get('kernel')->getProjectDir() 是什么意思? - MorganFreeFarm
1个回答

8
我建议在服务定义中显式传递参数,而不是将容器注入到命令中。 src/Command
class YourCommand extends Command
{
    private $path; 

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

    public function (InputInterface $input, OutputInterface $output)
    {
       echo $this->path;
    }
}

config/services.yaml

services:
    # ...

    App\Command\YourCommand:
        arguments:
            $path: '%kernel.project_dir%'

为什么您建议不要将容器注入Symfony命令? - ShahRokh
3
  1. 通过查看依赖关系,代码更易读,了解类的作用。
  2. 该类可测试性强,可以模拟依赖项而无需模拟整个容器。
  3. 注入容器被认为是不良实践。
  4. 当容器被编译时,会通知您缺少的依赖项。
  5. 当您使用$container->get('mailer')时,更容易进行类型提示。除非您使用@var Mailer等方法,否则IDE无法理解其含义。
还有许多原因可以直接使用依赖项。
- Robert
You probably forgot to call the parent constructor. - commonpike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接