Получение базового url-адреса веб-сайта и глобальная передача его в twig в Symfony 2
Я делаю переход от CodeIgniter к Symfony 2. Может кто-то пожалуйста, дайте мне пример:
- получить базовый url (url без конкретных частей маршрута)
- глобально передайте эту переменную в пучок веточек, чтобы я мог использовать ее в каждом шаблоне.
11 ответов:
почему вы должны получить этот URL-адрес корневой папки ? Вы не можете создать непосредственно абсолютный URL-адрес ?
{{ url('_demo_hello', { 'name': 'Thomas' }) }}
этот код ветки будет генерировать полный HTTP: / / url к маршруту _demo_hello.
фактически, получение базового url-адреса веб-сайта-это только получение полного url-адреса маршрута главной страницы:
{{ url('homepage') }}
(Домашняя страница, или как вы это называете в файле маршрутизации).
теперь это доступно бесплатно в шаблонах twig (протестировано на sf2 версии 2.0.14)
{{ app.request.getBaseURL() }}
в более поздних версиях Symfony (протестировано на 2.5), попробуйте:
{{ app.request.getSchemeAndHttpHost() }}
Вы можете использовать новый метод запрос
getSchemeAndHttpHost()
:{{ app.request.getSchemeAndHttpHost() }}
базовый url определяется внутри
Symfony\Component\Routing\RequestContext
.Он может быть извлечен из контроллера следующим образом:
$this->container->get('router')->getContext()->getBaseUrl()
действительно от 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
) если это в вашем URL.
<base href="{{ app.request.getSchemeAndHttpHost() }}"/>
или от контроллера
$this->container->get('router')->getContext()->getSchemeAndHttpHost()
для Symfony 2.3+, чтобы получить базовый url в контроллере должно быть
$this->get('request')->getSchemeAndHttpHost();
также для JS/css / image urls есть удобная функция asset ()
<img src="{{ asset('image/logo.png') }}"/>
вместо того, чтобы передавать переменную в шаблон глобально, вы можете определить базовый шаблон и отобразить в нем "глобальную часть". Базовый шаблон может быть унаследован.
пример шаблона рендеринга из документации symfony:
<div id="sidebar"> {% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %} </div>
для текущей версии 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 о как получить текущий объект запроса.