Как получить корневой каталог приложения Symfony2?
Каков наилучший способ получить корневой каталог приложений изнутри контроллера? Возможно ли получить его вне контроллера?
Теперь я получаю его, передавая его (из параметров) службе в качестве аргумента, например так:
services:
sr_processor:
class: Pro\Processor
arguments: [%kernel.root_dir%]
Есть ли лучший, более простой способ получить эту информацию в Symfony2?
4 ответа
ОБНОВЛЕНИЕ 2018-10-21:
На этой неделе getRootDir()
был объявлен устаревшим Пожалуйста, используйте getProjectDir()
вместо этого, как предложено в разделе комментариев Музарафом Али.
-
Использовать этот:
$this->get('kernel')->getRootDir();
И если вы хотите веб- корень:
$this->get('kernel')->getRootDir() . '/../web' . $this->getRequest()->getBasePath();
это будет работать из метода действия контроллера...
РЕДАКТИРОВАТЬ: Что касается услуг, я думаю, что способ, которым вы это сделали, является настолько чистым, насколько это возможно, хотя я бы передал полный сервис ядра в качестве аргумента... но это также сделает свое дело...
В Symfony 3.3 вы можете использовать
$projectRoot = $this->get('kernel')->getProjectDir();
получить рут web/ проекта.
Если вы используете этот путь для доступа к частям проектов, которые не являются кодом (например, каталог загрузки или база данных SQLite), то может быть лучше превратить путь в параметр, например так:
parameters:
database_path: '%kernel.root_dir%/../var/sqlite3.db'
Этот параметр может быть введен везде, где он вам нужен, поэтому вам больше не придется возиться с путями в вашем коде. Кроме того, параметр может быть переопределен во время развертывания. В конце концов, каждый программист будет лучше понимать, для чего вы его используете.
Обновление: исправлено постоянное использование kernel.root_dir.
Вы также можете использовать регулярное выражение в дополнение к этому:
$directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/yourbundle/';
$directoryPath = preg_replace("/app..../i", "", $directoryPath);
echo $directoryPath;
Начиная с Symfony 3.3 вы можете использовать привязку, например
services:
_defaults:
autowire: true
autoconfigure: true
bind:
$kernelProjectDir: '%kernel.project_dir%'
После этого вы можете использовать параметр $kernelProjectDir в любом контроллере ИЛИ службе. Как
class SomeControllerOrService
{
public function someAction(...., $kernelProjectDir)
{
.....