Я переходжу з CodeIgniter на Symfony 2. Чи може хтось дати мені приклад того, як:
- Отримати базову URL-адресу (URL-адресу без деталей маршруту)
- Глобально передайте цю змінну до набору гілочок, щоб я міг використовувати її в кожному шаблоні.
Я переходжу з CodeIgniter на Symfony 2. Чи може хтось дати мені приклад того, як:
Відповіді:
Навіщо потрібно отримувати цю кореневу URL-адресу? Ви не можете генерувати безпосередньо абсолютні URL-адреси?
{{ url('_demo_hello', { 'name': 'Thomas' }) }}
Цей код Twig генерує повну URL-адресу http: // до маршруту _demo_hello.
Насправді отримання базової URL-адреси веб-сайту означає отримання лише повної URL-адреси маршруту домашньої сторінки:
{{ url('homepage') }}
( домашня сторінка або як ви це називаєте у своєму файлі маршрутизації).
Тепер це доступно безкоштовно в шаблонах гілок (протестовано на 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()
Також для js / css / image urls є зручний функціональний актив ()
<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.url}}
Сподіваюся, це допомагає тому, хто все ще бореться.
site
містить?