Symfony 4,从自定义类(不是控制器类)获取项目的根路径

2022-08-30 12:09:07

在 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类中并且仅在控制器类中具有“控制器逻辑”更合适


答案 1

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

$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();

请注意:我不认为这是一个好主意,直到你有真正的需要,并且与类有关,而不是获得项目根目录。特别是如果你以后考虑为你的类创建单元测试。例如,您将通过需要创建模拟来自动增加复杂性。AppKernelAppKernel

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

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

并且您的构造函数将如下所示:

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

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

答案 2

无需注射Kernel

config/services.yaml

services:
    _defaults:
        autowire: true
        autoconfigure: true
        bind:
            $projectDir: '%kernel.project_dir%'

....

class Foo
{
    private $projectDir;

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

推荐