Доступ к файлам относительно пакета в Symfony2 - PullRequest
83 голосов
/ 28 сентября 2011

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

Ответы [ 4 ]

179 голосов
/ 28 сентября 2011

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

Например:

$kernel = $container->getService('kernel');
$path = $kernel->locateResource('@AdmeDemoBundle/path/to/file/Foo.txt');
78 голосов
/ 09 июля 2014

Ответ Томаса Келли хорош (и работает!), Но если вы используете внедрение зависимостей и / или не хотите привязывать свой код непосредственно к ядру, вам лучше использовать класс / сервис 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')
    }
}
6 голосов
/ 28 сентября 2011

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

3 голосов
/ 28 сентября 2011

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

$foo = __DIR__.'/Resources/config/config.yml';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...