获取网站的基本网址,并在Symfony 2中将其全局传递给twig

geo*_*ydv 83 url base-url symfony

我正在从CodeIgniter切换到Symfony 2.有人可以给我一个如何:

  • 获取基本网址(没有路由特定部分的网址)
  • 将此变量全局传递给twig bundle,以便我可以在每个模板中使用它.

cod*_*boy 137

现在可以在twig模板中免费使用(在sf2版本2.0.14上测试)

{{ app.request.getBaseURL() }}
Run Code Online (Sandbox Code Playgroud)

在后来的Symfony版本(在2.5上测试)中,尝试:

{{ app.request.getSchemeAndHttpHost() }}
Run Code Online (Sandbox Code Playgroud)

  • 这甚至可以缩短为`{{app.request.baseUrl}}`(它将找到getter方法并自动调用它) (35认同)
  • 这在以后的版本中不起作用(在sf 2.5上测试).以下答案`{{app.request.getSchemeAndHttpHost()}}`有效! (5认同)
  • @Colin O'Dell此外,它更加适用于不使用视图中的方法调用 - 视图不应该知道对象中有哪些方法.虽然它在symfony中看起来略有不同,但无论如何都是+10. (2认同)
  • 如果我不使用 *twig* 那么我如何在 *PHP* 中重写它? (2认同)

Dam*_*ien 85

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

{{ url('_demo_hello', { 'name': 'Thomas' }) }}
Run Code Online (Sandbox Code Playgroud)

此Twig代码将生成_demo_hello路径的完整http:// url.

事实上,获取网站的基本网址只是获取主页路线的完整网址:

{{ url('homepage') }}
Run Code Online (Sandbox Code Playgroud)

(主页,或您在路由文件中称之为的任何内容).


Hug*_*ira 51

您可以使用新的请求方法getSchemeAndHttpHost():

{{ app.request.getSchemeAndHttpHost() }}
Run Code Online (Sandbox Code Playgroud)


sum*_*lki 32

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

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

$this->container->get('router')->getContext()->getBaseUrl()
Run Code Online (Sandbox Code Playgroud)


Mat*_*sen 28

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

如果您希望将基本URL连接到Symfony应用程序,则应使用getSchemeAndHttpHost()连接在一起getBaseUrl(),类似于getUri()工作方式,除非没有路由器路径和查询字符串.

{{ app.request.schemeAndHttpHost ~ app.request.baseUrl }}
Run Code Online (Sandbox Code Playgroud)

例如,如果您的Symfony网站URL存在https://www.stackoverflow.com/app1/,那么这两个方法将返回以下值:

getSchemeAndHttpHost

https://www.stackoverflow.com
Run Code Online (Sandbox Code Playgroud)

getBaseUrl

/app1
Run Code Online (Sandbox Code Playgroud)

注意:getBaseUrl()包含脚本文件名(即/app.php),如果它在您的URL中.

  • 并且在 5.4 中仍然有效(也可能是 6,但我现在没有任何东西可以测试它)。这应该是最重要的答案。 (2认同)

Mr.*_* 14 17

对于Symfony 2.3+,要在控制器中获取基本URL应该是

$this->get('request')->getSchemeAndHttpHost();
Run Code Online (Sandbox Code Playgroud)


小智 14

 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>
Run Code Online (Sandbox Code Playgroud)

或来自控制器

$this->container->get('router')->getContext()->getSchemeAndHttpHost()
Run Code Online (Sandbox Code Playgroud)


Sas*_*ash 5

同样对于 js/css/image urls 有方便的函数 asset()

<img src="{{ asset('image/logo.png') }}"/>
Run Code Online (Sandbox Code Playgroud)

这将创建一个以/.

  • 请为您的答案添加更多解释 - asset 是否使用了 baseUrl?在我的项目中,它只打印相对 URL (2认同)

Arv*_*vid 5

对于当前的 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

另请参阅有关如何检索当前请求对象的Symfony 官方文档。