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

92

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

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

Ответы:

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();
Мистер 14
источник
$this->container->get('request')->getSchemeAndHttpHost()
Alex Quintero
16
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

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

$this->container->get('router')->getContext()->getSchemeAndHttpHost()
user3869574
источник
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
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
Иван Проскуряков
источник
0

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

ACJ
источник
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);
}
Vladtn
источник
-1

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

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

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

user12531260
источник
Откуда это взялось? Что siteсодержит?
Нико Хаасе
Это от Timber и Wordpress.
Константинос