9

我使用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 的冲突?

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

4

3 回答 3

13

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

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

代替:

$path = __DIR__.'/../../../src/Acme/AppBundle/Resources/config/services.xml'
于 2015-12-17T10:00:13.140 回答
7

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

于 2015-12-17T09:57:31.180 回答
0

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

ServiceNotFoundException in ContainerBuilder.php line 816:
You have requested a non-existent service "kernel".

在这种情况下,解决方案是使用从类$this->getPath()继承的方法。BundleNameBundleSymfony\Component\HttpKernel\Bundle\Bundle

这将返回相同的结果realpath(__DIR__)

这样做$this->getPath() . '/Resources/config/doctrine/mappings'是一样的realpath(__DIR__ . '/Resources/config/doctrine/mappings')

原来是在这里提出的。

于 2017-02-07T10:18:18.093 回答