Доступ к файлам относительно пакета в Symfony2
в конфигурации маршрутизации приложения Symfony2 я могу ссылаться на такой файл:
somepage:
prefix: someprefix
resource: "@SomeBundle/Resources/config/config.yml"
есть ли способ получить доступ к файлу относительно пакета в контроллере или другом PHP-коде? В частности, я пытаюсь использовать объект SymfonyComponentYamlParser для анализа файла, и я не хочу ссылаться на этот файл абсолютно. По сути, я хочу сделать это:
$parser = new Parser();
$config = $parser->parse( file_get_contents("@SomeBundle/Resources/config/config.yml") );
Я проверил класс SymfonyComponentFinderFinder, но я не думаю, что это то, что я ищу. Есть идеи? Или, может быть, я полностью упускаю из виду лучший способ сделать это?
4 ответов:
на самом деле, есть сервис, который вы могли бы использовать для этого, ядро (
$this->get('kernel')). Он имеет метод под названиемlocateResource().например:
$kernel = $container->getService('kernel'); $path = $kernel->locateResource('@AdmeDemoBundle/path/to/file/Foo.txt');
ответ Томаса Келли хорош (и работает!) но если вы используете инъекцию зависимостей и/или не хотите привязывать свой код непосредственно к ядру, вам лучше использовать класс FileLocator/service:
$fileLocator = $container->get('file_locator'); $path = $fileLocator->locate('@MyBundle/path/to/file.txt')
$fileLocatorбудет экземпляр\Symfony\Component\HttpKernel\Config\FileLocator.$pathбудет полный, абсолютный путь к файлу.даже если
file_locatorсам сервис использует ядро, это гораздо меньшая зависимость (проще заменить собственную реализацию, использовать тест двойники и т. д.)использовать его с инъекцией зависимостей:
# services.yml services: my_bundle.my_class: class: MyNamespace\MyClass arguments: - @file_locator # MyClass.php use Symfony\Component\Config\FileLocatorInterface as FileLocator; class MyClass { private $fileLocator; public function __construct(FileLocator $fileLocator) { $this->fileLocator = $fileLocator; } public function myMethod() { $path = $this->fileLocator->locate('@MyBundle/path/to/file.txt') } }
можно использовать
$container->getParameter('kernel.root_dir')для полученияappпапка вашего приложения и перейдите в каталоги к нужному файлу.
если вы хотите сделать это в файле, расположенном в
src/.../SomeBundle/...можно использовать__DIR__чтобы получить полный путь к текущему файлу. Затем добавьте вашResources/...путь к этому, как$foo = __DIR__.'/Resources/config/config.yml';
Comments