Доступ к файлам, относящимся к пакету в Symfony2

В конфигурации маршрутизации приложения Symfony2 я могу ссылаться на такой файл:

somepage: prefix: someprefix resource: "@SomeBundle/Resources/config/config.yml" 

Есть ли способ доступа к файлу относительно пакета в контроллере или другом PHP-коде? В частности, я пытаюсь использовать объект Symfony \ Component \ Yaml \ Parser для анализа файла, и я не хочу полностью ссылаться на этот файл. По сути, я хочу сделать это:

 $parser = new Parser(); $config = $parser->parse( file_get_contents("@SomeBundle/Resources/config/config.yml") ); 

Я проверил класс Symfony \ Component \ Finder \ Finder, но я не думаю, что это то, что я ищу. Есть идеи? Или, может быть, я полностью игнорирую лучший способ сделать это?

Solutions Collecting From Web of "Доступ к файлам, относящимся к пакету в Symfony2"

На самом деле, есть сервис, который вы можете использовать для этого, ядро ​​( $this->get('kernel') ). Он имеет метод locateResource() .

Например:

 $kernel = $container->getService('kernel'); $path = $kernel->locateResource('@AdmeDemoBundle/path/to/file/Foo.txt'); 

Ответ Томаса Келли хорош (и работает!), Но если вы используете инъекцию зависимостей и / или не хотите привязывать код непосредственно к ядру, вам лучше использовать класс / службу FileLocator:

 $fileLocator = $container->get('file_locator'); $path = $fileLocator->locate('@MyBundle/path/to/file.txt') 

$fileLocator будет экземпляром \Symfony\Component\HttpKernel\Config\FileLocator . $path будет полным, абсолютным путем к файлу.

Несмотря на то, что file_locator служба 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 вашего приложения и просмотреть свои каталоги в $container->getParameter('kernel.root_dir') файле.

Если вы хотите сделать это в файле, расположенном в src/.../SomeBundle/... вы можете использовать __DIR__ для получения полного пути к текущему файлу. Затем добавьте свой Resources/... путь к такому, как

 $foo = __DIR__.'/Resources/config/config.yml';