In a Symfony2 app\'s routing configuration, I can refer to a file like this:
somepage:
prefix: someprefix
resource: \"@SomeBundle/Resources/config/co
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');
If you want to do that in a file located in src/.../SomeBundle/...
you can use __DIR__
to get the full path of the current file. Then append your Resources/...
path to that like
$foo = __DIR__.'/Resources/config/config.yml';
You can use $container->getParameter('kernel.root_dir')
to get the app
folder of your application, and browse your directories to the file you want.
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')
}
}