在Symfony2中访问相对于Bundle的文件

时间:2011-09-28 15:17:58

标签: php symfony

在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类,但我认为这不是我想要的。有任何想法吗?或者我可能完全忽略了一种更好的方法吗?

4 个答案:

答案 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';