Я переключаюсь с CodeIgniter на Symfony 2. Кто-нибудь может дать мне пример того, как:
- Получить базовый URL-адрес (URL-адрес без частей маршрута)
- Глобально передайте эту переменную в набор веток, чтобы я мог использовать ее в каждом шаблоне.
Я переключаюсь с CodeIgniter на Symfony 2. Кто-нибудь может дать мне пример того, как:
Ответы:
Зачем вам нужен этот корневой URL? Разве вы не можете сгенерировать абсолютные URL-адреса?
{{ url('_demo_hello', { 'name': 'Thomas' }) }}
Этот код Twig сгенерирует полный URL-адрес http: // для маршрута _demo_hello.
Фактически, получение базового URL-адреса веб-сайта означает получение только полного URL-адреса маршрута домашней страницы:
{{ url('homepage') }}
( домашняя страница , или как вы ее называете в своем файле маршрутизации).
Теперь это доступно бесплатно в шаблонах twig (проверено на sf2 версии 2.0.14)
{{ app.request.getBaseURL() }}
В более поздних версиях Symfony (проверенных на 2.5) попробуйте:
{{ app.request.getSchemeAndHttpHost() }}
{{ app.request.baseUrl }}
(он найдет метод получения и вызовет его автоматически)
{{ app.request.getSchemeAndHttpHost() }}
работает!
Вы можете использовать новый метод запроса getSchemeAndHttpHost()
:
{{ app.request.getSchemeAndHttpHost() }}
Действительно от 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.
Базовый URL определяется внутри Symfony\Component\Routing\RequestContext
.
Его можно получить с контроллера следующим образом:
$this->container->get('router')->getContext()->getBaseUrl()
Для Symfony 2.3+, чтобы получить базовый URL-адрес в контроллере, необходимо
$this->get('request')->getSchemeAndHttpHost();
$this->container->get('request')->getSchemeAndHttpHost()
<base href="{{ app.request.getSchemeAndHttpHost() }}"/>
или от контроллера
$this->container->get('router')->getContext()->getSchemeAndHttpHost()
Также для URL-адресов js / css / image есть удобная функция 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 о том, как получить текущий объект запроса .
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
В 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);
}
Я попробовал все варианты, но они мне не подошли. В конце концов я получил его, используя
{{ адрес сайта }}
Надеюсь, это поможет тому, кто все еще борется.
site
содержит?