Как получить baseUrl в контроллере ZF2?

В моем контроллере zf2 я хочу получить базовый URL-адрес приложения (например, http://domain.com).

Я попробовал следующий вызов, но он возвращает пустую строку.

$this->request->getBasePath();

Как я могу получить http://domain.com часть URL-адреса в моем контроллере?

Ответы

Ответ 1

Я знаю, что это не самый красивый способ сделать это, но, эй, он работает:

public function indexAction()
{
    $uri = $this->getRequest()->getUri();
    $scheme = $uri->getScheme();
    $host = $uri->getHost();
    $base = sprintf('%s://%s', $scheme, $host);

    // $base would be http://domain.com
}

Или, если вы не возражаете сократить все, что вы могли бы сделать в двух строках:

public function indexAction()
{
    $uri = $this->getRequest()->getUri();
    $base = sprintf('%s://%s', $uri->getScheme(), $uri->getHost());
}

Ответ 2

Я не уверен, есть ли родной путь, но вы можете использовать экземпляр Uri из Request. Вы можете использовать этот фрагмент как обходной путь, пока не найдете лучшее решение:

$basePath = $this->getRequest()->getBasePath();
$uri = new \Zend\Uri\Uri($this->getRequest()->getUri());
$uri->setPath($basePath);
$uri->setQuery(array());
$uri->setFragment('');
$baseUrl = $uri->getScheme() . '://' . $uri->getHost() . '/' . $uri->getPath();

Это работает в контексте контроллера. Обратите внимание, что в строке 2 экземпляр Uri из запроса клонируется, чтобы не модифицировать экземпляр ury запроса напрямую (чтобы избежать побочных эффектов).

Я не доволен этим решением, но, по крайней мере, он один.

//Правка: Забыл добавить путь, исправлен!