Как получить корневой каталог приложения Symfony2?

107

Каков наилучший способ получить корневой каталог приложения внутри контроллера? Возможно ли получить его вне контроллера?

Теперь я получаю его, передавая его (из параметров) в службу в качестве аргумента, например:

services:

    sr_processor:
        class: Pro\Processor
        arguments: [%kernel.root_dir%]

Есть ли лучший, более простой способ получить эту информацию в Symfony2?

  • 13
    ваше решение лучшее
  • 4
    Вы смешиваете сервис и контроллер лет
Показать ещё 2 комментария
Теги:

4 ответа

202

Используйте это:

$this->get('kernel')->getRootDir();

И если вы хотите веб root:

$this->get('kernel')->getRootDir() . '/../web' . $this->getRequest()->getBasePath();

это будет работать из метода действий контроллера...

EDIT: Что касается услуг, я думаю, что способ, которым вы это делали, настолько чист, насколько это возможно, хотя я бы передал полную службу ядра в качестве аргумента... но это также будет делать трюк...

  • 3
    +1, но не точно для symfony2. Вместо этого используйте: $this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
  • 0
    Уверены ли вы? Я успешно использовал этот код в 2.0 -> 2.2 . Была ли изменена структура каталогов в 2.3 или master ?
Показать ещё 9 комментариев
7

Если вы используете этот путь для доступа к частям проектов, которые не являются кодом (например, каталогом загрузки или базой данных SQLite), тогда было бы лучше включить путь в параметр, например:

parameters:
    database_path: '%kernel.root_dir%/../var/sqlite3.db'

Этот параметр можно вводить везде, где он вам нужен, поэтому вам больше не придется путаться с путями в коде. Кроме того, параметр может быть переопределен во время развертывания. Наконец, каждый поддерживающий программист будет лучше понимать, для чего вы его используете.

Обновление: Исправлено постоянное использование kernel.root_dir.

6

В дополнение к этому вы также можете использовать регулярное выражение:

    $directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/yourbundle/';
    $directoryPath = preg_replace("/app..../i", "", $directoryPath);
    echo $directoryPath;
3

В Symfony 3.3 вы можете использовать

$projectRoot = $this->get('kernel')->getProjectDir();

чтобы получить корень сети/проекта.

  • 1
    Спасибо! Я люблю людей, которые читают заметки о выпуске)))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню