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