Получение базового URL сайта и глобальная передача его ветке в Symfony 2 - PullRequest
80 голосов
/ 27 июля 2011

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

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

Ответы [ 12 ]

132 голосов
/ 19 июля 2012

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

{{ app.request.getBaseURL() }}

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

{{ app.request.getSchemeAndHttpHost() }}
84 голосов
/ 28 июля 2011

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

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

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

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

{{ url('homepage') }}

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

49 голосов
/ 26 марта 2013

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

{{ app.request.getSchemeAndHttpHost() }}
32 голосов
/ 02 мая 2012

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

Его можно получить из контроллера следующим образом:

$this->container->get('router')->getContext()->getBaseUrl()
26 голосов
/ 23 декабря 2015

Действительно с 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.

16 голосов
/ 04 октября 2014

Для Symfony 2.3+, чтобы получить базовый URL-адрес в контроллере, должно быть

$this->get('request')->getSchemeAndHttpHost();
13 голосов
/ 23 июля 2014
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

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

$this->container->get('router')->getContext()->getSchemeAndHttpHost()
3 голосов
/ 29 апреля 2016

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

<img src="{{ asset('image/logo.png') }}"/>
2 голосов
/ 01 февраля 2012

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

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

<div id="sidebar">
  {% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>
1 голос
/ 11 июня 2018

Для текущей версии 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 о , как получить текущий объект запроса .

...