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


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

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

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>
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}

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