获取网站的基本URL并将其全局传递给Symfony 2中的树枝


Answers:


92

为什么需要获取此根URL?您不能直接生成绝对URL吗?

{{ url('_demo_hello', { 'name': 'Thomas' }) }}

此Twig代码将生成_demo_hello路由的完整http:// URL。

实际上,获取网站的基本URL只是获取首页路由的完整URL:

{{ url('homepage') }}

主页,或您在路由文件中称呼的任何名称)。


非常感谢,我以为这是要走的路,但是我只知道{{path(..)}}函数,导致错误的结果。{{url}}正是我所需要的。
Geoffrey De Vylder 2011年

万一我要从symfony控制台命令渲染树枝,假设要生成电子邮件模板,我需要基本URL。在这种情况下我该怎么办。
2013年


如果我不使用树枝,那么如何用PHP重写呢?
Nis 2014年

1
不起作用致命错误:未被捕获的Twig_Error_Syntax:在J:\ xampp \ htdocs \ sites \ opencart3020 \ system \ library \ template \ Twig \中的第5行的“ default / template / extension / module / featured.twig”中未知的“ url”函数ExpressionParser.php:574堆栈跟踪:#0
Kamlesh,

143

现在可在树枝模板中免费获得(在sf2版本2.0.14上测试)

{{ app.request.getBaseURL() }}

在更高版本的Symfony中(在2.5上测试),尝试:

{{ app.request.getSchemeAndHttpHost() }}

36
甚至可以简化为{{ app.request.baseUrl }}(它将找到getter方法并自动调用)
Colin O'Dell 2013年

2
@Colin O'Dell此外,在视图中不使用方法调用更合适-视图不应该知道对象中的方法。尽管它在symfony中看起来略有不同,但是无论如何该答案还是+10。
thorinkor

1
如果我不使用树枝,那么如何用PHP重写呢?
2014年

6
在更高版本中(在sf 2.5上测试),该功能不起作用。以下答案{{ app.request.getSchemeAndHttpHost() }}有效!
RayOnAir


35

从Symfony v2.1到v4.1 +有效

如果要使用Symfony应用程序的基本URL,则应getSchemeAndHttpHost()与串联使用getBaseUrl(),类似于getUri()工作方式,但没有路由器路径和查询字符串。

{{ app.request.schemeAndHttpHost ~ app.request.baseUrl }}

例如,如果您的Symfony网站网址位于 https://www.stackoverflow.com/app1/,则这两个方法将返回以下值:

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/app1

注意:如果您的网址中getBaseUrl()包含脚本文件名(即/app.php),则应包含该文件名。


34

基本网址在内部定义Symfony\Component\Routing\RequestContext

可以从控制器中获取,如下所示:

$this->container->get('router')->getContext()->getBaseUrl()

17

对于Symfony 2.3+,要在控制器中获取基本网址,应

$this->get('request')->getSchemeAndHttpHost();

$this->container->get('request')->getSchemeAndHttpHost()
Alex Quintero

16
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

或从控制器

$this->container->get('router')->getContext()->getSchemeAndHttpHost()

3

同样对于js / css / image网址,还有方便的函数asset()

<img src="{{ asset('image/logo.png') }}"/>

2
请为您的答案添加更多说明-资产到底会使用baseUrl吗?在我的项目中,它仅显示相对URL
Nico Haase

2

您可以定义基本模板并在其中渲染“全局零件”,而不是将变量全局传递给模板。基本模板可以被继承。

来自symfony文档的渲染模板示例:

<div id="sidebar">
  {% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>

2

对于当前的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官方文档,有关如何检索当前请求对象



0

在涉及多域应用程序的一种情况下,请app.request.getHttpHost帮帮我。它返回诸如example.comsubdomain.example.com(或example.com:8000当端口不是标准端口时)的信息。这是在Symfony 3.4中。


-1

我在这里尝试了所有选项,但它们对我没有用。最终我使用了它

{{site.url}}

希望这对仍在挣扎中的人有所帮助。


这是哪里来的?是什么site内容?
Nico Haase

那是来自Timber和Wordpress的。
康斯坦丁诺斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.