获取网站的基本url并将其全局传递给Symfony 2中的twig
我正在从CodeIgniter切换到Symfony 2。 有人能给我举个例子说明如何:获取网站的基本url并将其全局传递给Symfony 2中的twig,url,symfony,base-url,Url,Symfony,Base Url,我正在从CodeIgniter切换到Symfony 2。 有人能给我举个例子说明如何: 获取基本url(不包含路由特定部分的url) 全局地将这个变量传递给twig bundle,这样我就可以在每个模板中使用它 为什么需要获取此根url?您不能直接生成绝对URL吗 {{ url('_demo_hello', { 'name': 'Thomas' }) }} 此细枝代码将生成到_demo_hello路由的完整http://url 事实上,获取网站的基本url只是获取主页路径的完整url: {{
- 获取基本url(不包含路由特定部分的url)
- 全局地将这个变量传递给twig bundle,这样我就可以在每个模板中使用它
{{ url('_demo_hello', { 'name': 'Thomas' }) }}
此细枝代码将生成到_demo_hello路由的完整http://url
事实上,获取网站的基本url只是获取主页路径的完整url:
{{ url('homepage') }}
(主页,或路由文件中的任何名称)。您可以定义基础模板并在其中呈现“全局部分”,而不是将变量全局传递给模板。可以继承基础模板 symfony文档中的渲染模板示例:
<div id="sidebar">
{% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>
{%render“AcmeArticleBundle:Article:recentArticles”与{'max':3}%}
基本url在Symfony\Component\Routing\RequestContext
中定义
它可以从控制器中提取,如下所示:
$this->container->get('router')->getContext()->getBaseUrl()
现在可以在twig模板中免费使用(在sf2版本2.0.14上测试) 在以后的Symfony版本(在2.5上测试)中,请尝试:
您可以使用新的请求方法
getSchemeAndHttpHost()
:
对于Symfony 2.3+,要在控制器中获取基本url,应
$this->get('request')->getSchemeAndHttpHost();
从Symfony v2.1到v4.1有效+ 如果希望将基本URL连接到Symfony应用程序,则应使用与
getBaseUrl()
连接在一起的getSchemeAndHttpHost()
,类似于getUri()
的工作方式,但不包括路由器路径和查询字符串
{{ app.request.schemeAndHttpHost ~ app.request.baseUrl }}
例如,如果您的Symfony网站URL位于https://www.stackoverflow.com/app1/
,则这两种方法返回以下值:
getSchemeAndHttpHost
https://www.stackoverflow.com
getBaseUrl
/app1
注意:
getBaseUrl()
包括脚本文件名(即/app.php
),如果它在您的URL中。同样对于js/css/image URL,还有方便的函数asset()
这将为当前Symfony版本创建一个以
/
开头的绝对url(截至编写此答案时,它是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;
}
}
在一个涉及多域应用程序的情况下,app.request.getHttpHost
帮助了我。它返回类似于example.com
或subdomain.example.com
(或example.com:8000
,当端口不是标准端口时)。这是在Symfony 3.4中实现的。我在这里尝试了所有选项,但它们对我不起作用。
最终,我使用了
{{site.url}
希望这对仍在挣扎的人有所帮助。在Symfony 5和控制器方法的常见情况下,使用注入的请求对象:
可能的重复非常感谢,我认为这是一种方法,但我只知道{{path(..}}}函数,导致错误的结果。{{url}}正是我所需要的。如果我从symfony控制台命令呈现树枝,假设要生成电子邮件模板,我需要基本url。在这种情况下我该怎么做。有一本食谱:如果我没有使用twig,那么我如何在PHP中重写它?不工作致命错误:未捕获twig\u错误\u语法:第5行“default/template/extension/module/featured.twig”中的未知“url”函数。在J:\xampp\htdocs\sites\opencart3020\system\library\template\Twig\ExpressionParser.php:574堆栈跟踪:#0甚至可以缩短为{{app.request.baseUrl}}
(它将找到getter方法并自动调用该方法)@Colin O'Dell,更合适的做法是不要在视图中使用方法调用-视图不应该知道对象中有哪些方法。虽然它在symfony中看起来有点不同,但是对于这个答案还是+10。如果我没有使用twig,那么我如何在PHP中重写它?这在以后的版本中不起作用(在sf 2.5上测试)。下面的答案{{app.request.getSchemeAndHttpHost()}
有效<代码>$this->container->get('request')->getSchemeAndHttpHost()
此函数是在Symfony 2.1中引入的,它从何而来?站点
包含哪些内容?来自Timber和Wordpress。请在您的回答中添加一些解释-asset到底使用baseUrl吗?在我的项目中,它只打印一个相对URL。在我的项目中,asset使用baseurl,但不使用host和scheme。它生成一个以/开头的绝对url。因此,它在
$this->get('request')->getSchemeAndHttpHost();
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
{{ app.request.schemeAndHttpHost ~ app.request.baseUrl }}
https://www.stackoverflow.com
/app1
<img src="{{ asset('image/logo.png') }}"/>
<?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;
}
}
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);
}