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