在Symfony2中访问与Bundle相关的文件
在Symfony2应用程序的路由configuration中,我可以像这样引用一个文件:
somepage: prefix: someprefix resource: "@SomeBundle/Resources/config/config.yml"
有什么办法可以访问控制器或其他PHP代码中的相关文件? 特别是,我试图使用一个Symfony \ Component \ Yaml \ Parser对象来parsing一个文件,我不想完全引用该文件。 基本上,我想这样做:
$parser = new Parser(); $config = $parser->parse( file_get_contents("@SomeBundle/Resources/config/config.yml") );
我已经检查了Symfony \ Component \ Finder \ Finder类,但我不认为这就是我正在寻找的。 有任何想法吗? 或者,也许我完全忽略了这样做的更好方法?
事实上,有一个服务可以用于这个,内核( $this->get('kernel')
)。 它有一个名为locateResource()
的方法。
例如:
$kernel = $container->getService('kernel'); $path = $kernel->locateResource('@AdmeDemoBundle/path/to/file/Foo.txt');
Thomas Kelley的答案是好的(而且是有效的),但是如果你正在使用dependency injection和/或不想直接将你的代码绑定到内核上,最好使用FileLocator类/ service:
$fileLocator = $container->get('file_locator'); $path = $fileLocator->locate('@MyBundle/path/to/file.txt')
$fileLocator
将是\Symfony\Component\HttpKernel\Config\FileLocator
一个实例。 $path
将是文件的完整path。
即使file_locator
服务本身使用内核,它也是一个小得多的依赖(更容易取代自己的实现,使用testing双打等)
通过dependency injection来使用它:
# 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__
来获得当前文件的完整path。 然后追加你的Resources/...
path
$foo = __DIR__.'/Resources/config/config.yml';