Получение базового 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.