Accessing Files Relative to Bundle in Symfony2

后端 未结 4 1259
说谎
说谎 2020-11-30 18:13

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

somepage:
    prefix: someprefix
    resource: \"@SomeBundle/Resources/config/co         


        
相关标签:
4条回答
  • 2020-11-30 18:50

    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');
    
    0 讨论(0)
  • 2020-11-30 18:58

    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';
    
    0 讨论(0)
  • 2020-11-30 18:59

    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.

    0 讨论(0)
  • 2020-11-30 19:08

    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')
        }
    }
    
    0 讨论(0)
提交回复
热议问题