Как получить корневой каталог приложения 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)
    {
          .....