获取网站的基本 url 并将其全局传递给 Symfony 2 中的 twig
我正在从 CodeIgniter 切换到 Symfony 2。 有人可以给我一个如何执行以下操作的示例:
- 获取基本 url(不带路由特定部分的 url)
- 将此变量全局传递给 twig 包,以便我可以在每个模板中使用它。
I'm making the switch from CodeIgniter to Symfony 2.
Can someone please give me an example of how to:
- Get the base url (the url without the route specific parts)
- Globally pass this variable to the twig bundle so I can use it in every template.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(14)
基本 url 在
Symfony\Component\Routing\RequestContext
中定义。它可以从控制器中获取,如下所示:
Base url is defined inside
Symfony\Component\Routing\RequestContext
.It can be fetched from controller like this:
对于 Symfony 2.3+,要获取控制器中的基本 url 应该是
For Symfony 2.3+, to get the base url in a controller should be
或来自控制器
or from controller
对于当前的 Symfony 版本(截至撰写此答案时为 Symfony 4.1),不要像其他一些答案中那样直接访问服务容器。
相反(除非您不使用标准服务配置),通过类型提示注入请求对象。
另请参阅关于如何检索当前请求对象的 Symfony 官方文档。
For current Symfony version (as of writing this answer it's Symfony 4.1) do not directly access the service container as done in some of the other answers.
Instead (unless you don't use the standard services configuration), inject the request object by type-hinting.
See also official Symfony docs about how to retrieve the current request object.
另外,对于 js/css/image url,还有一个方便的函数 asset(),
它会创建一个以
/
开头的绝对 url。Also for js/css/image urls there's handy function asset()
This creates an absolute url starting with
/
.在 Symfony 5 和控制器方法的常见情况下,使用注入的 Request 对象:
In Symfony 5 and in the common situation of a controller method use the injected Request object:
您可以定义一个基本模板并在其中呈现“全局部分”,而不是将变量全局传递给模板。基本模板可以继承。
渲染模板示例来自 symfony 文档:
Instead of passing variable to template globally, you can define a base template and render the 'global part' in it. The base template can be inherited.
Example of rendering template From the symfony Documentation:
在一种涉及多域应用程序的情况下,
app.request.getHttpHost
帮助了我。它返回类似example.com
或subdomain.example.com
(如果端口不是标准的,则返回example.com:8000
)。这是 Symfony 3.4 中的情况。In one situation involving a multi-domain application,
app.request.getHttpHost
helped me out. It returns something likeexample.com
orsubdomain.example.com
(orexample.com:8000
when the port is not standard). This was in Symfony 3.4.我尝试了这里的所有选项,但它们对我不起作用。
最终我使用它来工作
希望这可以帮助那些仍在苦苦挣扎的人。
I tried all the options here but they didnt work for me.
Eventually I got it working using
Hope this helps someone who is still struggling.
现在可以在 twig 模板中免费使用(在 sf2 版本 2.0.14 上测试)。
在更高版本的 Symfony 版本中(在 2.5 上测试),尝试:
This is now available for free in twig templates (tested on sf2 version 2.0.14)
In later Symfony versions (tested on 2.5), try :
为什么需要获取这个 root url ?不能直接生成绝对URL吗?
此 Twig 代码将生成 _demo_hello 路由的完整 http:// url。
事实上,获取网站的基本 url 只是获取主页路由的完整 url:(
主页,或者您在路由文件中调用的任何名称)。
Why do you need to get this root url ? Can't you generate directly absolute URL's ?
This Twig code will generate the full http:// url to the _demo_hello route.
In fact, getting the base url of the website is only getting the full url of the homepage route :
(homepage, or whatever you call it in your routing file).
您可以使用新的请求方法
getSchemeAndHttpHost()
:You can use the new request method
getSchemeAndHttpHost()
:从 Symfony v2.1 到 v6.0+ 有效
如果您想要 Symfony 应用程序的基本 URL,您应该使用
getSchemeAndHttpHost()
与getBaseUrl()
连接在一起,类似getUri()
的工作原理,除了没有路由器路径和查询字符串。例如,如果您的 Symfony 网站 URL 位于
https://www.stackoverflow.com/webapp/
,则这两个方法将返回以下值:getSchemeAndHttpHost
getBaseUrl
注意:
getBaseUrl()
包含脚本文件名(即/app.php
)(如果它位于您的 URL 中)。Valid from Symfony v2.1 through v6.0+
If you want the base URL to a Symfony application, you should use
getSchemeAndHttpHost()
concatenated together withgetBaseUrl()
, similar to howgetUri()
works, except without the router path and query string.For example, if your Symfony website URL lives at
https://www.stackoverflow.com/webapp/
, then these two methods return these values:getSchemeAndHttpHost
getBaseUrl
Note:
getBaseUrl()
includes the script filename (ie/app.php
) if it's in your URL.