Большое спасибо, я думал, что это правильный путь, но я знал только о функции {{path (..)}}, приводящей к неверным результатам. {{url}} - это как раз то, что мне нужно.
Джеффри Де Вилдер
что в случае, если я визуализирую ветку из консольной команды symfony, скажем, для создания шаблона электронной почты мне нужен базовый URL. Как мне поступить в таком случае.
Это можно даже сократить до {{ app.request.baseUrl }}(он найдет метод получения и вызовет его автоматически)
Колин О'Делл
2
@Colin O'Dell, кроме того, еще более целесообразно НЕ ИСПОЛЬЗОВАТЬ вызовы методов в представлении - представление не должно знать, какие методы находятся в объекте. Хотя в symfony это выглядит немного иначе, но все равно +10 за этот ответ.
Торинкор
1
Если я не использую twig, как я могу переписать это на PHP ?
Ниш
6
Это НЕ работает в более поздних версиях (проверено на sf 2.5). Приведенный ниже ответ {{ app.request.getSchemeAndHttpHost() }}работает!
RayOnAir
55
Вы можете использовать новый метод запроса getSchemeAndHttpHost():
Если вам нужен базовый URL-адрес для приложения Symfony, вы должны использовать getSchemeAndHttpHost()объединенный вместе с getBaseUrl(), аналогично тому, как это getUri()работает, за исключением пути маршрутизатора и строки запроса.
Например, если URL-адрес вашего веб-сайта Symfony находится по адресу https://www.stackoverflow.com/app1/, эти два метода возвращают следующие значения:
getSchemeAndHttpHost
https://www.stackoverflow.com
getBaseUrl
/app1
Примечание: getBaseUrl()включает имя файла сценария (т.е. /app.php), если оно есть в вашем URL.
Пожалуйста, добавьте еще несколько пояснений к своему ответу - все-таки актив использует baseUrl? В моих проектах он просто выводит относительный URL
Нико Хаасе
2
Вместо того, чтобы передавать переменную в шаблон глобально, вы можете определить базовый шаблон и отобразить в нем «глобальную часть». Базовый шаблон можно унаследовать.
Пример шаблона рендеринга Из документации Symfony:
<div id="sidebar">
{% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>
Для текущей версии Symfony (на момент написания этого ответа это Symfony 4.1) не имеет прямого доступа к контейнеру службы, как это сделано в некоторых других ответах.
Вместо этого (если вы не используете стандартную конфигурацию служб) вставьте объект запроса с помощью подсказки типа.
<?phpnamespaceApp\Service;
useSymfony\Component\HttpFoundation\RequestStack;
/**
* The YourService class provides a method for retrieving the base URL.
*
* @package App\Service
*/classYourService{
/**
* @var string
*/protected $baseUrl;
/**
* YourService constructor.
*
* @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
*/publicfunction__construct(RequestStack $requestStack)
{
$this->baseUrl = $requestStack->getCurrentRequest()->getSchemeAndHttpHost();
}
/**
* Returns the current base URL.
*
* @return string
*/publicfunctiongetBaseUrl(): string{
return$this->baseUrl;
}
}
В одной ситуации, связанной с многодоменным приложением, app.request.getHttpHostмне помогло. Он возвращает что-то вроде example.comили subdomain.example.com(или example.com:8000когда порт не является стандартным). Это было в Symfony 3.4.
Ответы:
Зачем вам нужен этот корневой URL? Разве вы не можете сгенерировать абсолютные URL-адреса?
{{ url('_demo_hello', { 'name': 'Thomas' }) }}
Этот код Twig сгенерирует полный URL-адрес http: // для маршрута _demo_hello.
Фактически, получение базового URL-адреса веб-сайта означает получение только полного URL-адреса маршрута домашней страницы:
{{ url('homepage') }}
( домашняя страница , или как вы ее называете в своем файле маршрутизации).
источник
Теперь это доступно бесплатно в шаблонах twig (проверено на sf2 версии 2.0.14)
В более поздних версиях Symfony (проверенных на 2.5) попробуйте:
источник
{{ app.request.baseUrl }}
(он найдет метод получения и вызовет его автоматически){{ app.request.getSchemeAndHttpHost() }}
работает!Вы можете использовать новый метод запроса
getSchemeAndHttpHost()
:источник
Действительно от Symfony v2.1 до v4.1 +
Если вам нужен базовый URL-адрес для приложения Symfony, вы должны использовать
getSchemeAndHttpHost()
объединенный вместе сgetBaseUrl()
, аналогично тому, как этоgetUri()
работает, за исключением пути маршрутизатора и строки запроса.Например, если URL-адрес вашего веб-сайта Symfony находится по адресу
https://www.stackoverflow.com/app1/
, эти два метода возвращают следующие значения:getSchemeAndHttpHost
https://www.stackoverflow.com
getBaseUrl
Примечание:
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')) }}
источник
В одной ситуации, связанной с многодоменным приложением,
app.request.getHttpHost
мне помогло. Он возвращает что-то вродеexample.com
илиsubdomain.example.com
(илиexample.com:8000
когда порт не является стандартным). Это было в Symfony 3.4.источник
В 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
содержит?