Php 为什么Symfony中不应使用绝对路径常数\uuuuu DIR\uuuuuuuuuuu和\uuuuuuuu FILE\uuuuuuuuuu

Php 为什么Symfony中不应使用绝对路径常数\uuuuu DIR\uuuuuuuuuuu和\uuuuuuuu FILE\uuuuuuuuuu,php,symfony,magic-constants,Php,Symfony,Magic Constants,我用它来控制我的代码质量 对于简单的文件上载,我必须获得上载目录的绝对路径: protected function getUploadRootDir() { // the absolute directory path where uploaded return __DIR__.'/../../../../web/'.$this->getUploadDir(); } 直接来自官方文档的代码() 但是,如果分析的代码包含\uuuuu DIR\uuuuu或\uuu FILE\

我用它来控制我的代码质量

对于简单的文件上载,我必须获得上载目录的绝对路径:

protected function getUploadRootDir()
{
    // the absolute directory path where uploaded
    return __DIR__.'/../../../../web/'.$this->getUploadDir();
}
直接来自官方文档的代码()

但是,如果分析的代码包含
\uuuuu DIR\uuuuu
\uuu FILE\uuuuu
PHP魔法常量,SLInsight会发出警告:

\uuuuu DIR\uuuuu
\uuuu FILE\uuuu
常量可能与Symfony资源覆盖系统冲突

此常量的使用如何导致与Symfony冲突


我如何在代码中避免它们呢?

这实际上是SensioLabs Insight无法正确处理的事情。
由于资源覆盖系统的原因,它警告不要使用常量,但在许多情况下,这些常量用于与资源覆盖系统无关的位置(这里的代码可能就是这种情况)。因此,您可以忽略本例中的警告

对于文件上载类,您可能可以忽略此错误消息。但在其他情况下,最好使用Symfony文件定位器,而不是硬编码文件路径。例如:

$path = $this->get('kernel')->locateResource('@AppBundle/Resources/config/services.xml');
而不是:

$path = __DIR__.'/../../../src/Acme/AppBundle/Resources/config/services.xml'

如果您正在创建第三方bundle并希望找到一些资源,@Javier提出的(好的)解决方案不适用,因为它引发了一个异常:

ServiceNotFoundException in ContainerBuilder.php line 816:
You have requested a non-existent service "kernel".
在这种情况下,解决方案是使用
$this->getPath()
,一种由
BundleNameBundle
Symfony\Component\HttpKernel\Bundle\Bundle
类继承的方法

这将返回与realpath(\uuu DIR\uuu)相同的结果

这样做
$this->getPath()/Resources/config/doctor/mappings'
与realpath(\uuuu DIR\uuuu.'/Resources/config/doctor/mappings')相同


最初提出。

标题有误导性。一般建议使用绝对路径常数
\uuuuu FILE\uuuuu
\uuuu DIR\uuuu
。只有在项目中使用Symfony(或它的文件定位器)时,才最好使用Symfony的文件定位器。谢谢你说实话,如果我看到那段代码,我的反应会是“肯定有比这更好的方法”。您正在硬编码您想要的路径正好是4级,然后是一个名为“web”的目录,然后是一个动态段。这看起来非常脆弱和不灵活。当然,整个路径应该在某个特定的基础上进行配置。你是对的,Symfony为获取路径提供了帮助程序,以获取应用程序不同部分的路径(即@JavierEguiluz的答案),但它们不能从实体访问。此外,整个方法可以通过在控制器中而不是实体中进行优化。嗨,Eguiluz先生,在实体模型中使用此代码正确吗?(我过去认为调用内核或其他服务在模型内部并不“非常干净”…)好吧,我想说的是,从实体获取upload dir已经不干净了。实体不应该负责知道上传的文件存储在哪里(可能不是本地的,但是在S3上),谢谢你的解释,先生,非常感谢你的整个工作。今天早上,在单元测试中提出了警告。此规则应限于可以使用symfony资源覆盖系统的类。
kernel
服务在编译时不可用(首先是因为它是合成的),因此您不能在编译器过程中使用它,但实际上它在任何运行时上下文中都可以正常工作。这里的上下文是一个实体,因此我们不应该使用服务,而且由于我的实体不是捆绑包实例(因为它没有意义),
getPath
不可用。所以忽略前面两个答案中的警告仍然是最好的解决方案,我猜是的,我知道。在bundle创建上下文中查找问题时,我添加了这个问题的答案。但这里提出的解决方案并不合适。因此,我添加了答案,以便在bundle创建的上下文中寻找解决方案的人能够找到它。是用于内部链接。。。