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

121

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

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

services:

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

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

Давид Охия
источник
13
ваше решение лучше всего
Inoryy
4
ты путаешь сервис и контроллер йо
Джон Смит
4
Опять же, для Symfony 3.3 и более поздних версий используйте, %kernel.project_dir%чтобы получить root-доступ к вашему проекту.
Музафар Али
1
обязательно ["%kernel.root_dir%"]
заключайте

Ответы:

220

ОБНОВЛЕНИЕ 2018-10-21:

С этой недели getRootDir()не рекомендуется. Пожалуйста, используйте getProjectDir()вместо этого, как это предлагается в разделе комментариев Музараф Али.

-

Использовать это:

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

И если вам нужен веб- корень:

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

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

РЕДАКТИРОВАТЬ: Что касается служб, я думаю, что то, как вы это сделали, максимально чисто, хотя я бы передал полную службу ядра в качестве аргумента ... но это также поможет ...

Йован Перович
источник
3
+1 но не для symfony2. Используйте вместо:$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
Себастьян
36
Это решение подходит только для контроллеров. Здесь речь идет об услугах. В любом случае, зачем передавать весь контейнер только для получения переменной? Намного лучше передать просто% kernel.root_dir%
Массимилиано Арионе
2
Массимилиано прав, и в качестве дополнения я использую $this->container->getParameter('kernel.cache_dir')в контроллерах вместо решения, которое вы предоставили
лаккович 10
2
Это было больше связано с тем, что ваш сервис containerвнедрил :) Если вы будете следовать лучшим практикам, containerследует избегать инъекции любой ценой. Что касается решения получить webкаталог, я все еще использую тот, который я предоставил выше;)
Йован Перович
4
Начиная с Symfony 3.3 и более %kernel.project_dir%/web/%kernel.root_dir%/../web/
Музафар Али
15

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

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

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

Крис
источник
8

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

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

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

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

MauganRa
источник
6

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

    $directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/yourbundle/';
    $directoryPath = preg_replace("/app..../i", "", $directoryPath);
    echo $directoryPath;
Tragaknight
источник
2

Начиная с Symfony 3.3 вы можете использовать привязку, например

services:
_defaults:
    autowire: true      
    autoconfigure: true
    bind:
        $kernelProjectDir: '%kernel.project_dir%'

После этого вы можете использовать параметр $ kernelProjectDir в любом контроллере ИЛИ службе. Как

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....
Андрей Жилин
источник