Доступ к файлам, относящимся к пакету в 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, но я не думаю, что то, что я ищу. Есть идеи? Или, может быть, я полностью игнорирую лучший способ сделать это?

Ответ 1

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

Например:

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

Ответ 2

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

$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')
    }
}

Ответ 3

Вы можете использовать $container->getParameter('kernel.root_dir'), чтобы получить папку app вашего приложения и просмотреть ваши каталоги в нужном файле.

Ответ 4

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

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