Как получить путь сервера к веб-каталогу в Symfony2 изнутри контроллера?


вопрос следующий:

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

что я уже нашел (также, поискав здесь):

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

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

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

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

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

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

8 61

8 ответов:

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

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

для доступа к корневому каталогу из-за пределов контроллера вы можете просто ввести %kernel.root_dir% в качестве аргумента в настройки служб.

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

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

public function __construct($rootDir)
{
    $this->webRoot = realpath($rootDir . '/../web');
}

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

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

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

    $container->get('request')->getBasePath();
    // in controller:
    $this->getRequest()->getBasePath();
    

вы находитесь на Symfony, подумайте "инъекция зависимости"^^

во всем моем проекте SF, я делаю в параметрах.yml:

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

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

$this->getParameter('web_dir');

обновление: с 2.8 это больше не работает, потому что assetic больше не включен по умолчанию. Хотя если вы используете assetic это будет работать.

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

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

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

мое решение-добавить этот код в приложение.php

define('WEB_DIRECTORY', __DIR__);

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

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

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

$request->server->get('DOCUMENT_ROOT').$request->getBasePath()
$host = $request->server->get('HTTP_HOST');
$base = (!empty($request->server->get('BASE'))) ? $request->server->get('BASE') : '';
$getBaseUrl = $host.$base;