Отримання базової URL-адреси веб-сайту та глобальна передача його гілці в 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}} - це саме те, що мені потрібно.
Geoffrey De Vylder

що у випадку, якщо я візуалізую гілочку з команди консолі symfony, скажімо, для створення шаблону електронної пошти, мені потрібна базова URL-адреса. Як мені робити в такому випадку.
vishal

1
Для цього існує кулінарна книга: symfony.com/doc/master/cookbook/console/sending_emails.html
Дамієн,

Якщо я не використовую гілочку, то як я можу переписати це у PHP ?
Ніш,

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

143

Тепер це доступно безкоштовно в шаблонах гілок (протестовано на sf2, версія 2.0.14)

{{ app.request.getBaseURL() }}

У пізніших версіях Symfony (протестовано на версії 2.5) спробуйте:

{{ app.request.getSchemeAndHttpHost() }}

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

2
Крім того, Колін О'Делл, ще більш доречно НЕ ВИКОРИСТОВУВАТИ виклики методів у поданні - подання не повинно знати, які методи є в об'єкті. Хоча це виглядає дещо різним у symfony, але все одно +10 для цієї відповіді.
thorinkor

1
Якщо я не використовую гілочку, то як я можу переписати це у PHP ?
Ніш,

6
Це НЕ працює в пізніших версіях (перевірено на sf 2.5). Відповідь нижче {{ app.request.getSchemeAndHttpHost() }}працює!
RayOnAir

55

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

{{ app.request.getSchemeAndHttpHost() }}

1
Ця функція була введена в Symfony 2.1
COil 02

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


4

Також для js / css / image urls є зручний функціональний актив ()

<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.url}}

Сподіваюся, це допомагає тому, хто все ще бореться.


Звідки це? Що siteмістить?
Ніко Хаасе,

Це від Timber та Wordpress.
Костянтинос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.