Получение базового URL-адреса веб-сайта и отправка его на веточку в Symfony 2
Я делаю переход от CodeIgniter к Symfony 2.
Может кто-нибудь, пожалуйста, дайте мне пример того, как:
- Получить базовый URL-адрес (URL-адрес без определенных маршрутов)
- Глобально передайте эту переменную в пучок ветвей, чтобы я мог использовать ее в каждом шаблоне.
Ответы
Ответ 1
Зачем вам нужен этот корневой URL? Не можете ли вы создать абсолютный URL-адрес?
{{ url('_demo_hello', { 'name': 'Thomas' }) }}
Этот код Twig генерирует полный URL http://для маршрута _demo_hello.
Фактически, получение базового URL-адреса веб-сайта получает только полный URL-адрес маршрута домашней страницы:
{{ url('homepage') }}
(домашняя страница или все, что вы назовете в своем файле маршрутизации).
Ответ 2
Теперь это доступно бесплатно в шаблонах ветки (проверено на sf2 версии 2.0.14)
{{ app.request.getBaseURL() }}
В более поздних версиях Symfony (проверенных на 2.5) попробуйте:
{{ app.request.getSchemeAndHttpHost() }}
Ответ 3
Вы можете использовать новый метод запроса getSchemeAndHttpHost()
:
{{ app.request.getSchemeAndHttpHost() }}
Ответ 4
Базовый url определяется внутри Symfony\Component\Routing\RequestContext
.
Он может быть извлечен из контроллера следующим образом:
$this->container->get('router')->getContext()->getBaseUrl()
Ответ 5
Действительно с Symfony v2.1 до v4. 1+
Если вы хотите использовать базовый URL-адрес для приложения Symfony, вы должны использовать getSchemeAndHttpHost()
объединенный вместе с getBaseUrl()
, аналогично тому, как работает getUri()
, за исключением пути к маршрутизатору и строки запроса.
{{ app.request.schemeAndHttpHost ~ app.request.baseUrl }}
Например, если URL вашего веб-сайта Symfony находится по адресу https://www.stackoverflow.com/app1/
, то эти два метода возвращают следующие значения:
getSchemeAndHttpHost
https://www.stackoverflow.com
getBaseUrl
/app1
Примечание: getBaseUrl()
включает имя файла скрипта (т.е. /app.php
), если оно /app.php
в вашем URL.
Ответ 6
Для Symfony 2.3+ для получения базового url в контроллере должно быть
$this->get('request')->getSchemeAndHttpHost();
Ответ 7
<base href="{{ app.request.getSchemeAndHttpHost() }}"/>
или из контроллера
$this->container->get('router')->getContext()->getSchemeAndHttpHost()
Ответ 8
Также для URL-адресов js/css/image есть полезная функция asset()
<img src="{{ asset('image/logo.png') }}"/>
Ответ 9
Вместо того, чтобы передавать глобальную переменную в шаблон, вы можете определить базовый шаблон и отобразить в нем "глобальную часть". Базовый шаблон может быть унаследован.
Пример шаблона рендеринга Из symfony Документация:
<div id="sidebar">
{% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>
Ответ 10
Для текущей версии Symfony (на момент написания этого ответа это Symfony 4.1) не осуществлялся прямой доступ к контейнеру службы, как это было сделано в некоторых других ответах.
Вместо этого (если вы не используете стандартную конфигурацию служб), введите объект запроса, используя подсказку типа.
<?php
namespace App\Service;
use Symfony\Component\HttpFoundation\RequestStack;
/**
* The YourService class provides a method for retrieving the base URL.
*
* @package App\Service
*/
class YourService
{
/**
* @var string
*/
protected $baseUrl;
/**
* YourService constructor.
*
* @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
*/
public function __construct(RequestStack $requestStack)
{
$this->baseUrl = $requestStack->getCurrentRequest()->getSchemeAndHttpHost();
}
/**
* Returns the current base URL.
*
* @return string
*/
public function getBaseUrl(): string
{
return $this->baseUrl;
}
}
Смотрите также официальные документы Symfony о том, как получить текущий объект запроса.
Ответ 11
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
Ответ 12
В одной ситуации, связанной с app.request.getHttpHost
приложением, app.request.getHttpHost
помог мне. Он возвращает что-то вроде example.com
или subdomain.example.com
(или example.com:8000
когда порт не стандартный). Это было в Symfony 3.4.