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

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

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

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

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

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

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

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

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

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

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

На самом деле нет прямого способа получить путь к 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 (fi 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(); 

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

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

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

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

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

Мое решение состоит в том, чтобы добавить этот код в app.php

 define('WEB_DIRECTORY', __DIR__); 

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

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

Вы находитесь на Symfony, подумайте «Injection of Dependency» ^^

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

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

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

 $this->getParameter('web_dir'); 

Для 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;