Получить путь к каталогу внутри пакета в 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');
}
}