Получить путь к каталогу внутри пакета в Symfony

внутри контроллера мне нужно получить путь к директории внутри пакета. Вот я и говорю:

class MyController extends Controller{

    public function copyFileAction(){
        $request = $this->getRequest();

        $directoryPath = '???'; // /web/bundles/mybundle/myfiles
        $request->files->get('file')->move($directoryPath);

        // ...
    }
}

Как сделать правильно $directoryPath?

2 ответов


что-то вроде этого:

$directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/mybundle/myfiles';

есть лучший способ сделать это:

$this->container->get('kernel')->locateResource('@AcmeDemoBundle')

даст абсолютный путь к AcmeDemoBundle

$this->container->get('kernel')->locateResource('@AcmeDemoBundle/Resource')

даст путь к ресурсу dir внутри AcmeDemoBundle и так далее...

InvalidArgumentException будет вызвано, если такой dir / file не существует.

кроме того, в определении контейнера вы можете использовать:

my_service:
class: AppBundle\Services\Config
    arguments: ["@=service('kernel').locateResource('@AppBundle/Resources/customers')"]

редактировать

ваши услуги не должны зависеть от ядро. Там является сервисом symfony по умолчанию, который вы можете использовать: file_locator. Он использует Kernel:: locateResource внутренне, но легче удвоить / издеваться в ваших тестах.

определение сервиса

my_service:
    class: AppBundle\Service
    arguments: ['@file_locator']

класс

namespace AppBundle;

use Symfony\Component\HttpKernel\Config\FileLocator;

class Service
{  
   private $fileLocator;

   public function __construct(FileLocator $fileLocator) 
   {
     $this->fileLocator = $fileLocator;
   }

   public function doSth()
   {
     $resourcePath = $this->fileLocator->locate('@AppBundle/Resources/some_resource');
   }
}