Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing Files Relative to Bundle in Symfony2

Tags:

php

symfony

In a Symfony2 app's routing configuration, I can refer to a file like this:

somepage:     prefix: someprefix     resource: "@SomeBundle/Resources/config/config.yml" 

Is there any way to access a file relative to the bundle within a controller or other PHP code? In particular, I'm trying to use a Symfony\Component\Yaml\Parser object to parse a file, and I don't want to refer to that file absolutely. Essentially, I want to do this:

$parser = new Parser(); $config = $parser->parse( file_get_contents("@SomeBundle/Resources/config/config.yml") ); 

I've checked out the Symfony\Component\Finder\Finder class, but I don't think that's what I'm looking for. Any ideas? Or maybe I'm completely overlooking a better way of doing this?

like image 503
Thomas Kelley Avatar asked Sep 28 '11 15:09

Thomas Kelley


2 Answers

As a matter of fact, there is a service you could use for this, the kernel ($this->get('kernel')). It has a method called locateResource().

For example:

$kernel = $container->getService('kernel'); $path = $kernel->locateResource('@AdmeDemoBundle/path/to/file/Foo.txt'); 
like image 77
kgilden Avatar answered Sep 17 '22 13:09

kgilden


Thomas Kelley's answer is good (and works!) but if you are using dependency injection and/or don't want to tie your code directly to the kernel, you're better off using the FileLocator class/service:

$fileLocator = $container->get('file_locator'); $path = $fileLocator->locate('@MyBundle/path/to/file.txt') 

$fileLocator will be an instance of \Symfony\Component\HttpKernel\Config\FileLocator. $path will be the full, absolute path to the file.

Even though the file_locator service itself uses the kernel, it's a much smaller dependency (easier to substitute for your own implementation, use test doubles, etc.)

To use it with 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')     } } 
like image 36
fazy Avatar answered Sep 19 '22 13:09

fazy