В конфигурации маршрутизации приложения 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, но не думаю, что это то, что я ищу. Есть идеи? Или, может быть, я полностью упускаю из виду лучший способ сделать это?
\InvalidArgumentException
, если файл не может быть найден или имя недействительно, а также\RuntimeException
если имя содержит недопустимые / небезопасные символы.Ответ Томаса Келли хорош (и работает!), Но если вы используете внедрение зависимостей и / или не хотите связывать свой код напрямую с ядром, вам лучше использовать класс / службу 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') } }
источник
MyClass
зависит код ?». ТекущаяFileLocator
реализация используетKernelInterface
, но если это изменится в будущемMyClass
, не нужно об этом знать. Кроме того, теперь стало яснее, чтоMyClass
действительно нужно (и меньше соблазна связать это с другими функциями ядра). Сказав все это, конструктор, вероятно, должен требовать,Symfony\Component\Config\FileLocatorInterface
а неSymfony\Component\HttpKernel\Config\FileLocator
. Тогда вы можете написать свой собственный.Вы можете использовать его,
$container->getParameter('kernel.root_dir')
чтобы получитьapp
папку вашего приложения и найти в каталогах нужный файл.источник
src/Acme/Bundle/MyBundle
,src/Acme/MyBundle
,vendor/acme/my-bundle/src
и так далее.Если вы хотите сделать это в файле, расположенном в,
src/.../SomeBundle/...
вы можете использовать__DIR__
для получения полного пути к текущему файлу. Затем добавьте свойResources/...
путь к этому как$foo = __DIR__.'/Resources/config/config.yml';
источник