为什么不应在Symfony

时间:2015-12-17 09:47:47

标签: php symfony magic-constants

我使用SensioLabs Insight来控制代码质量。

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

protected function getUploadRootDir()
{
    // the absolute directory path where uploaded
    return __DIR__.'/../../../../web/'.$this->getUploadDir();
}

代码直接来自官方文档(How to handle file uploads with Doctrine

但如果分析的代码包含__DIR____FILE__ PHP魔术常量,则SLInsight会发出警告:

  

__DIR____FILE__常量可能与Symfony资源覆盖系统冲突。

这些常量的使用如何导致与Symfony的冲突?

我怎样才能在代码中避免它们?

3 个答案:

答案 0 :(得分:13)

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

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

而不是:

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

答案 1 :(得分:7)

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

答案 2 :(得分:0)

如果您要创建第三方软件包并想要查找某些资源,@ 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')相同。

最初提出here