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

554   4  

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

    Ничего не найдено.