Почему абсолютные константы пути __DIR__ и __FILE__ не должны использоваться в Symfony

я использую SensioLabs Insight контролировать качество моего кода.

Для простой загрузки файла я должен получить абсолютный путь к моей папке загрузок:

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

Код непосредственно из официальной документации (Как обрабатывать загрузку файлов с помощью Doctrine)

Но SLInsight выдает предупреждение, если анализируемый код содержит __DIR__ или же __FILE__ Магические константы PHP:

__DIR__ а также __FILE__ константы могут конфликтовать с системой переопределения ресурсов Symfony.

Как использование этих констант может вызвать конфликты с Symfony?

И как я могу избежать их в моем коде?

9

Решение

В случае с классом загрузки файлов вы, вероятно, можете игнорировать это сообщение об ошибке. Но в других случаях лучше использовать локатор файлов Symfony вместо жестких путей к файлам. Например:

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

Вместо:

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

Другие решения

Ну, это на самом деле то, что SensioLabs Insight не обрабатывает должным образом.
Он предупреждает против использования констант из-за системы переопределения ресурсов, но во многих случаях эти константы используются в местах, которые не связаны с системой переопределения ресурсов (и это, вероятно, имеет место для вашего кода здесь). Таким образом, вы можете игнорировать предупреждение в этом случае

7

Если вы создаете сторонний пакет и хотите найти некоторые ресурсы, (хорошее) решение, предложенное @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'),

Первоначально предложено Вот.

0
По вопросам рекламы [email protected]