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

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

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

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

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

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

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

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

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

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

 $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 из BundleNameBundle Symfony\Component\HttpKernel\Bundle\Bundle .

Это возвращает тот же результат realpath(__DIR__) .

Итак, $this->getPath() . '/Resources/config/doctrine/mappings' $this->getPath() . '/Resources/config/doctrine/mappings' совпадает с realpath(__DIR__ . '/Resources/config/doctrine/mappings') .

Первоначально предлагалось здесь .