Как получить путь сервера к веб-каталогу в Symfony2 изнутри контроллера? - PullRequest
62 голосов
/ 13 февраля 2012

Вопрос заключается в следующем:

Как я могу получить путь к серверу к веб-каталогу в Symfony2 изнутри контроллера (или откуда-то еще по этой причине)

What I 'мы уже нашли (также, выполнив поиск здесь):

Об этом говорится в статье поваренной книги об обработке файлов Doctrine

$path = __DIR__ . '/../../../../web';

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

$path = $this->get('kernel')->getRootDir() . '/../web';

Итак, нет ли абсолютно никакого способа получить хотя бы эту «веб» часть пути?Что, если я, например, решил переименовать его или переместить, или что-то еще?

В первом symfony все было легко, когда я мог получить все, что мне нужно, из любого места в коде, вызывая static sfConfig ::метод get () ..

Ответы [ 9 ]

47 голосов
/ 13 февраля 2012

На самом деле прямого пути к webdir в Symfony2 нет, так как фреймворк полностью независим от webdir.

Вы можете использовать getRootDir() в экземпляре класса ядра, так же, как вы пишете.Если вы планируете переименовать /web dir в будущем, вы должны сделать его настраиваемым.Например, AsseticBundle имеет такую ​​опцию в конфигурации DI (см. здесь и здесь ).

44 голосов
/ 15 января 2014

Чтобы получить доступ к корневому каталогу извне контроллера, вы можете просто ввести %kernel.root_dir% в качестве аргумента в конфигурации ваших служб.

service_name:
    class: Namespace\Bundle\etc
    arguments: ['%kernel.root_dir%']

Затем вы можете получить веб-корень в конструкторе класса:

public function __construct($rootDir)
{
    $this->webRoot = realpath($rootDir . '/../web');
}
17 голосов
/ 13 февраля 2012

Вы также можете получить его из любого класса ContainerAware (например, Controller) из службы запросов:

  • Если вы используете Apache в качестве веб-сервера (я полагаю, для других веб-серверы решение будет аналогичным) и используют виртуальный хостинг (ваши URL выглядят так - localhost/app.php, тогда вы можете использовать:

    $container->get('request')->server->get('DOCUMENT_ROOT');
    // in controller:
    $this->getRequest()->server->get('DOCUMENT_ROOT');
    
  • Остальное (ваши URL выглядят так - localhost/path/to/Symfony/web/app.php:

    $container->get('request')->getBasePath();
    // in controller:
    $this->getRequest()->getBasePath();
    
15 голосов
/ 20 сентября 2016

Вы находитесь в Symfony, подумайте "Внедрение зависимостей" ^^

Во всех моих SF проектах я делаю это в parameters.yml:

web_dir: "%kernel.root_dir%/../web"

Так что я могу безопасно использовать этот параметр в контроллере:

$this->getParameter('web_dir');
12 голосов
/ 14 января 2015

ОБНОВЛЕНИЕ: начиная с версии 2.8 это больше не работает, потому что сборка больше не включена по умолчанию.Хотя, если вы используете сборку, это будет работать.

Вы можете использовать переменную %assetic.write_to%.

$this->getParameter('assetic.write_to');

, так как ваши активы зависят от этой переменной, которая будет выброшенав ваш веб-каталог, можно предположить и использовать для поиска вашей веб-папки.

http://symfony.com/doc/current/reference/configuration/assetic.html

12 голосов
/ 26 ноября 2012

Мое решение - добавить этот код в app.php

define('WEB_DIRECTORY', __DIR__);

Проблема в том, что в коде командной строки, использующем константу, произойдет сбой.Вы также можете добавить константу в файл app / console и другие фронт-контроллеры среды

Другим решением может быть добавление статического метода в AppKernel, который возвращает DIR . '/ .. / web /«Так что вы можете получить доступ везде

2 голосов
/ 11 октября 2017

Для Symfony3 В вашем контроллере попробуйте

$request->server->get('DOCUMENT_ROOT').$request->getBasePath()
0 голосов
/ 22 января 2019

Начиная с Symfony 3.3,

Вы можете использовать %kernel.project_dir%/web/ вместо %kernel.root_dir%/../web/

0 голосов
/ 22 ноября 2017
$host = $request->server->get('HTTP_HOST');
$base = (!empty($request->server->get('BASE'))) ? $request->server->get('BASE') : '';
$getBaseUrl = $host.$base;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...