在Symfony2应用程序的路由配置中,我可以引用这样的文件:
somepage:
prefix: someprefix
resource: "@SomeBundle/Resources/config/config.yml"
有没有办法在控制器或其他PHP代码中访问相对于bundle的文件?特别是,我正在尝试使用Symfony \ Component \ Yaml \ Parser对象来解析文件,我不想绝对引用该文件。基本上,我想这样做:
$parser = new Parser();
$config = $parser->parse( file_get_contents("@SomeBundle/Resources/config/config.yml") );
我已经查看了Symfony \ Component \ Finder \ Finder类,但我认为这不是我想要的。有任何想法吗?或者我可能完全忽略了一种更好的方法吗?
答案 0 :(得分:179)
事实上,你可以使用一个服务,即内核($this->get('kernel')
)。它有一个名为locateResource()
的方法。
例如:
$kernel = $container->getService('kernel');
$path = $kernel->locateResource('@AdmeDemoBundle/path/to/file/Foo.txt');
答案 1 :(得分:78)
Thomas Kelley的答案很好(并且有效!)但是如果您使用依赖注入和/或不想将代码直接绑定到内核,那么最好使用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')
}
}
答案 2 :(得分:6)
您可以使用$container->getParameter('kernel.root_dir')
获取应用程序的app
文件夹,并将目录浏览到所需的文件。
答案 3 :(得分:3)
如果要在位于src/.../SomeBundle/...
的文件中执行此操作,可以使用__DIR__
获取当前文件的完整路径。然后将您的Resources/...
路径附加到
$foo = __DIR__.'/Resources/config/config.yml';