Як отримати кореневий редактор програми Symfony2?


121

Який найкращий спосіб отримати кореневий каталог додатків всередині контролера? Чи можна дістати його поза контролером?

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

services:

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

Чи є кращий, простіший спосіб отримати цю інформацію в Symfony2?


13
найкраще ваше рішення
Inoryy

4
ви змішуєте службу та контролер, йо
Джон Сміт

4
Знову для Symfony 3.3 і далі, %kernel.project_dir%щоб отримати корінь вашого проекту.
Музафар Алі

1
обов'язково інкапсулюйте ["%kernel.root_dir%"]
буквари

Відповіді:


220

ОНОВЛЕННЯ 2018-10-21:

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

—-

Використовуй це:

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

І якщо ви хочете веб- корінь:

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

це буде працювати від методу дії контролера ...

EDIT: Що стосується сервісів, я думаю, що так, як ви це зробили, це максимально чисто, хоча я б передав повне обслуговування ядра як аргумент ... але це також зробить фокус ...


3
+1, але не є точним для symfony2. Використовуйте замість цього:$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
Себастьян

36
Це рішення підходить тільки для контролерів. Тут мова йде про послуги. У будь-якому випадку, навіщо передавати весь контейнер просто для отримання змінної? Це набагато краще , щоб пройти тільки% kernel.root_dir%
Массіміліано Arione

2
Масміліміано має рацію, і як додаток, я використовую $this->container->getParameter('kernel.cache_dir')в контролерах замість запропонованого вами рішення
lackovic10,

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.


6

Крім цього ви можете також використовувати регулярний вираз:

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

2

З Symfony 3.3 ви можете використовувати прив'язку, наприклад

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

Після цього ви можете використовувати параметр $ kernelProjectDir в будь-якій службі контролера АБО. Так як

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.