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

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

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

11 ответов


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

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

этот код веточки создаст полный url http:// к маршруту _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 через В4.1+

если вы хотите базовый URL для приложения Symfony, вы должны использовать getSchemeAndHttpHost() объединяются вместе с getBaseUrl(), похожие на how getUri() работает, за исключением пути маршрутизатора и строки запроса.

{{ app.request.schemeAndHttpHost ~ app.request.baseUrl }}

например, если URL вашего сайта Symfony живет по адресу https://www.stackoverflow.com/app1/, то эти два метода возвращают эти значения:

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/app1

Примечание: getBaseUrl() включает имя файла скрипта (ie /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 о как получить текущий объект запроса.