98

我正在从 CodeIgniter 切换到 Symfony 2。有人可以给我一个示例,说明如何:

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

14 回答 14

147

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

{{ app.request.getBaseURL() }}

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

{{ app.request.getSchemeAndHttpHost() }}
于 2012-07-19T10:25:41.397 回答
97

为什么你需要得到这个根 url?你不能直接生成绝对 URL 吗?

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

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

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

{{ url('homepage') }}

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

于 2011-07-27T20:18:53.370 回答
60

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

{{ app.request.getSchemeAndHttpHost() }}
于 2013-03-25T20:17:11.727 回答
46

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

如果你想要一个 Symfony 应用程序的基本 URL,你应该使用getSchemeAndHttpHost()concatenated with getBaseUrl(),类似于getUri()工作原理,除了没有路由器路径和查询字符串。

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

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

getSchemeAndHttpHost

https://www.stackoverflow.com

获取BaseUrl

/app1

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

于 2015-12-23T17:40:08.983 回答
37

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

它可以像这样从控制器中获取:

$this->container->get('router')->getContext()->getBaseUrl()
于 2012-05-02T08:05:39.827 回答
20

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

$this->get('request')->getSchemeAndHttpHost();
于 2014-10-04T14:11:49.393 回答
16
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

或从控制器

$this->container->get('router')->getContext()->getSchemeAndHttpHost()
于 2014-07-23T16:01:07.283 回答
5

对于 js/css/image url,还有方便的函数 assets()

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

这将创建一个以/.

于 2016-04-29T15:10:57.280 回答
3

对于当前的 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 官方文档。

于 2018-06-11T12:47:24.163 回答
2

您可以定义一个基本模板并在其中呈现“全局部分”,而不是将变量全局传递给模板。可以继承基本模板。

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

<div id="sidebar">
  {% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>
于 2012-02-01T07:32:47.580 回答
2

在 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);
}
于 2020-10-30T11:02:37.493 回答
0
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
于 2014-11-23T19:32:58.237 回答
0

在涉及多域应用程序的一种情况下,app.request.getHttpHost帮助了我。它返回类似example.com或的东西subdomain.example.com(或者example.com:8000当端口不是标准的时候)。这是在 Symfony 3.4 中。

于 2019-05-07T18:06:24.657 回答
-3

我在这里尝试了所有选项,但它们对我不起作用。最终我让它工作了

{{ 网站.url }}

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

于 2019-12-13T12:11:41.273 回答