首页 > 解决方案 > Symfony 4,从自定义类(不是控制器类)获取项目的根路径

问题描述

在 src/Utils 目录中,我为各种事物创建了一个自定义类Foo。我正在寻找一种方法来获取 symfony 4 项目的绝对根路径

从控制器,它很容易:

$webPath = $this->get('kernel')->getProjectDir();

但是从我在 src/Utils 目录中创建的自定义类中,如何获取根路径目录?

我可以将控制器的路径传递给Foo类:

$webPath = $this->get('kernel')->getProjectDir();
$faa = new Foo($webPath);
$faa->doSomething();

但我认为将这些信息存储在 Foo 类中并且在控制器类中只有“控制器逻辑”更合适

标签: phpsymfony4

解决方案


在 SymfonyAppKernel类中处理方法下的项目根目录getProjectDir()。要将其放入控制器中,您可以执行以下操作:

$projectRoot = $this->get('kernel')->getProjectDir();

它将返回一个项目根目录。

如果您需要在您的一个类中使用项目根目录,您有两个选择,我将介绍给您。AppKernel首先是作为依赖传递:

class Foo 
{
    /** KernelInterface $appKernel */
    private $appKernel;

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

感谢 Symfony 4 自动装配依赖项,它将自动注入到您的类中,您可以通过以下方式访问它:

$this->appKernel->getProjectDir();

请注意:我认为这不是一个好主意,除非您有真正的需要,并且与AppKernel类有关,而不是获取项目根目录。特别是如果您稍后考虑为您的班级创建单元测试。例如,您将需要创建模拟来自动增加复杂性AppKernel

第二个选项和恕我直言更好的是只传递一个带有目录路径的字符串。您可以通过在内部定义一个服务来实现这一点,config/services.yaml如下所示:

services:
    (...)
    MyNamespace\Foo:
        arguments:
            - %kernel.project_dir%

你的构造函数看起来像:

class Foo 
{
    /** string $rootPath */
    private $rootPath;

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

推荐阅读