Получение базового URL сайта и его глобальная передача ветке в Symfony 2

66

Я делаю переход от CodeIgniter к Symfony 2. Может кто-нибудь, пожалуйста, дайте мне пример того, как:

  • Получить базовый URL-адрес (URL-адрес без определенных маршрутов)
  • Глобально передайте эту переменную в пучок ветвей, чтобы я мог использовать ее в каждом шаблоне.
Теги:
url
base-url

10 ответов

64
Лучший ответ

Зачем вам нужен этот корневой URL? Не можете ли вы создать абсолютный URL-адрес?

{{ url('_demo_hello', { 'name': 'Thomas' }) }}

Этот код Twig генерирует полный URL http://для маршрута _demo_hello.

Фактически, получение базового URL-адреса веб-сайта получает только полный URL-адрес маршрута домашней страницы:

{{ url('homepage') }}

(домашняя страница или все, что вы назовете в своем файле маршрутизации).

  • 0
    Большое спасибо, я думал, что это путь, но я знал только о функции {{path (..)}}, что приводило к неверным результатам. {{url}} это то, что мне нужно.
  • 0
    Что в случае, если я отрисовываю веточку из командной консоли symfony, скажем, для генерации шаблона электронной почты, мне нужен базовый URL. Как мне поступить в таком случае.
Показать ещё 4 комментария
107

Теперь это доступно бесплатно в шаблонах ветки (проверено на sf2 версии 2.0.14)

{{ app.request.getBaseURL() }}

В более поздних версиях Symfony (проверенных на 2.5) попробуйте:

{{ app.request.getSchemeAndHttpHost() }}
  • 34
    Это можно даже сократить до {{ app.request.baseUrl }} (он найдет метод getter и вызовет его автоматически)
  • 2
    @Colin О'Делл, кроме того, еще более уместно НЕ ИСПОЛЬЗОВАТЬ вызовы методов в представлении - представление не должно знать, какие методы находятся в объекте. Хотя в Symfony это выглядит немного иначе, но все равно +10 за этот ответ.
Показать ещё 3 комментария
44

Вы можете использовать новый метод запроса getSchemeAndHttpHost():

{{ app.request.getSchemeAndHttpHost() }}
  • 1
    Эта функция была введена в Symfony 2.1
29

Базовый url определяется внутри Symfony\Component\Routing\RequestContext.

Он может быть извлечен из контроллера следующим образом:

$this->container->get('router')->getContext()->getBaseUrl()
15

Если вам нужен базовый 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() содержит имя файла script (т.е. /app.php), если оно указано в вашем URL.

  • 0
    Это должен быть правильный ответ.
14

Для Symfony 2.3+ для получения базового url в контроллере должно быть

$this->get('request')->getSchemeAndHttpHost();
  • 0
    $this->container->get('request')->getSchemeAndHttpHost()
13
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

или из контроллера

$this->container->get('router')->getContext()->getSchemeAndHttpHost()
2

Также для URL-адресов js/css/image есть полезная функция asset()

<img src="{{ asset('image/logo.png') }}"/>
1

Вместо того, чтобы передавать глобальную переменную в шаблон, вы можете определить базовый шаблон и отобразить в нем "глобальную часть". Базовый шаблон может быть унаследован.

Пример шаблона рендеринга Из symfony Документация:

<div id="sidebar">
  {% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>
0
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню