我使用SensioLabs Insight来控制我的代码质量。
对于简单的文件上传,我必须获取上传目录的绝对路径:
protected function getUploadRootDir()
{
// the absolute directory path where uploaded
return __DIR__.'/../../../../web/'.$this->getUploadDir();
}
直接来自官方文档的代码(如何使用 Doctrine 处理文件上传(
但是,如果分析的代码包含__DIR__
或__FILE__
PHP 魔术常量,SLInsight 会发出警告:
__DIR__
和__FILE__
常量可能与Symfony资源覆盖系统冲突。
使用此常量如何导致与Symfony的冲突?
如何在代码中避免它们?
对于文件上传类,您可能可以忽略此错误消息。但在其他情况下,最好使用Symfony文件定位器而不是硬编码文件路径。例如:
$path = $this->get('kernel')->locateResource('@AppBundle/Resources/config/services.xml');
而不是:
$path = __DIR__.'/../../../src/Acme/AppBundle/Resources/config/services.xml'
嗯,这实际上是SensioLabs Insight无法正确处理的事情。由于资源覆盖系统,它警告不要使用这些常量,但在许多情况下,这些常量用于与资源覆盖系统无关的地方(此处的代码可能就是这种情况(。因此,在这种情况下您可以忽略警告
如果您正在创建第三方捆绑包并希望找到一些资源,则 @Javier 提出的(好的(解决方案不适用,因为它会引发异常:
ServiceNotFoundException in ContainerBuilder.php line 816:
You have requested a non-existent service "kernel".
在这种情况下,解决方案是使用 $this->getPath()
,这是BundleNameBundle
从 Symfony'Component'HttpKernel'Bundle'Bundle
类继承的方法。
这将返回与 realpath(__DIR__)
相同的结果。
所以做$this->getPath() . '/Resources/config/doctrine/mappings'
和realpath(__DIR__ . '/Resources/config/doctrine/mappings')
一样。
最初在这里提出。