Вопрос заключается в следующем:
Как я могу получить путь сервера к веб-каталогу в Symfony2 изнутри контроллера (или из другого места по этой причине)
Что я уже нашел (также, выполнив поиск здесь):
Это рекомендуется в статье поваренной книги об обработке файлов Doctrine
$path = __DIR__ . '/../../../../web';
Найденный путем поиска вокруг, доступен только изнутри контроллера (или службы с ядром):
$path = $this->get('kernel')->getRootDir() . '/../web';
Итак, нет абсолютно никакого способа получить хотя бы эту "веб-часть" пути? Что, если я, например, решил переименовать или переместить или что-то еще?
Все было легко в первом symfony, когда я мог получить все, что мне нужно, из любого места в коде, вызвав статический метод sfConfig:: get().
На самом деле нет прямого способа получить путь к webdir в Symfony2, поскольку структура полностью не зависит от webdir.
Вы можете использовать getRootDir()
в экземпляре класса ядра, как и вы пишете. Если вы планируете переименовать dir в будущем, вы должны настроить его. Например, 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 как веб-сервер (я полагаю, для других
webservers решение будет аналогичным) и используют
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, подумайте "Injection of Dependency" ^^
Во всем моем проекте SF, я делаю в параметрах .yml:
web_dir: "%kernel.root_dir%/../web"
Поэтому я могу безопасно использовать этот параметр в контроллере:
$this->getParameter('web_dir');
ОБНОВЛЕНИЕ: Начиная с 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/' Таким образом, вы можете получить доступ во всем мире
Для Symfony3 В контроллере попробуйте
$request->server->get('DOCUMENT_ROOT').$request->getBasePath()
С Symfony 3.3,
Вы можете использовать %kernel.project_dir%/web/
вместо %kernel.root_dir%/../web/
$host = $request->server->get('HTTP_HOST');
$base = (!empty($request->server->get('BASE'))) ? $request->server->get('BASE') : '';
$getBaseUrl = $host.$base;