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