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


92

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

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

Ответы:


91

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

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

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

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

{{ url('homepage') }}

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


Большое спасибо, я думал, что это правильный путь, но я знал только о функции {{path (..)}}, приводящей к неверным результатам. {{url}} - это как раз то, что мне нужно.
Джеффри Де Вилдер

что в случае, если я визуализирую ветку из консольной команды symfony, скажем, для создания шаблона электронной почты мне нужен базовый URL. Как мне поступить в таком случае.
Vishal

1
Для этого есть кулинарная книга: symfony.com/doc/master/cookbook/console/sending_emails.html
Дэмиен

Если я не использую twig, как я могу переписать это на PHP ?
Ниш

1
Не работает Неустранимая ошибка: Uncaught Twig_Error_Syntax: Неизвестная функция "url" в "default / template / extension / module / Feature.twig" в строке 5. в J: \ xampp \ htdocs \ sites \ opencart3020 \ system \ library \ template \ Twig \ ExpressionParser.php: 574 Стек след: # 0
Kamlesh

143

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

{{ app.request.getBaseURL() }}

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

{{ app.request.getSchemeAndHttpHost() }}

36
Это можно даже сократить до {{ app.request.baseUrl }}(он найдет метод получения и вызовет его автоматически)
Колин О'Делл

2
@Colin O'Dell, кроме того, еще более целесообразно НЕ ИСПОЛЬЗОВАТЬ вызовы методов в представлении - представление не должно знать, какие методы находятся в объекте. Хотя в symfony это выглядит немного иначе, но все равно +10 за этот ответ.
Торинкор

1
Если я не использую twig, как я могу переписать это на PHP ?
Ниш

6
Это НЕ работает в более поздних версиях (проверено на sf 2.5). Приведенный ниже ответ {{ app.request.getSchemeAndHttpHost() }}работает!
RayOnAir

55

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

{{ app.request.getSchemeAndHttpHost() }}

1
Эта функция была представлена ​​в Symfony 2.1
COil

37

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


34

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

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

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

17

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

$this->get('request')->getSchemeAndHttpHost();

$this->container->get('request')->getSchemeAndHttpHost()
Alex Quintero

16
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

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

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

4

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

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

2
Пожалуйста, добавьте еще несколько пояснений к своему ответу - все-таки актив использует baseUrl? В моих проектах он просто выводит относительный URL
Нико Хаасе

2

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

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

<div id="sidebar">
  {% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>

2

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



0

В одной ситуации, связанной с многодоменным приложением, app.request.getHttpHostмне помогло. Он возвращает что-то вроде example.comили subdomain.example.com(или example.com:8000когда порт не является стандартным). Это было в Symfony 3.4.


0

В Symfony 5 и в обычной ситуации метода контроллера используйте внедренный объект Request :

public function controllerFunction(Request $request, LoggerInterface $logger)
  ...
  $scheme = $request->getSchemeAndHttpHost();
  $logger->info('Domain is: ' . $scheme);
  ...
  //prepare to render
  $retarray = array(
    ...
    'scheme' => $scheme,
    ...
    );
  return $this->render('Template.html.twig', $retarray);
}

-1

Я попробовал все варианты, но они мне не подошли. В конце концов я получил его, используя

{{ адрес сайта }}

Надеюсь, это поможет тому, кто все еще борется.


Откуда это взялось? Что siteсодержит?
Нико Хаасе

Это от Timber и Wordpress.
Константинос
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.