php - 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 类中并且在控制器类中只有“控制器逻辑”更合适
解决方案
在 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;
}
}
推荐阅读
- python - Gensim Summarizer 抛出 MemoryError,有什么解决方案吗?
- pascal - 如果函数/过程无法执行,则返回错误消息
- java - 什么是未来
? - maven - 使用 JavaFX 和 Maven 在文件夹 lib 中构建具有外部依赖项的项目
- tfs - 在签入 tfs 时,不会提示门控签入构建。直接办理入住。
- admob - AdMob 和 GDPR 选择哪些广告技术提供商?
- javascript - 如何实现长滚动行为
- video - 自动视频创建 API
- node.js - 即使电子邮件未送达也能成功响应
- android - 如何使用 DevicePolicyManger API 中的 installCaCert 方法?