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

发布于 2024-11-26 16:08:33 字数 147 浏览 5 评论 0原文

我正在从 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(14

溺深海 2024-12-03 16:08:34

基本 url 在 Symfony\Component\Routing\RequestContext 中定义。

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

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

Base url is defined inside Symfony\Component\Routing\RequestContext.

It can be fetched from controller like this:

$this->container->get('router')->getContext()->getBaseUrl()
只等公子 2024-12-03 16:08:34

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

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

For Symfony 2.3+, to get the base url in a controller should be

$this->get('request')->getSchemeAndHttpHost();
不必了 2024-12-03 16:08:34
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

或来自控制器

$this->container->get('router')->getContext()->getSchemeAndHttpHost()
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

or from controller

$this->container->get('router')->getContext()->getSchemeAndHttpHost()
也只是曾经 2024-12-03 16:08:34

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

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.

<?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;
    }
}

See also official Symfony docs about how to retrieve the current request object.

御弟哥哥 2024-12-03 16:08:34

另外,对于 js/css/image url,还有一个方便的函数 asset(),

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

它会创建一个以 / 开头的绝对 url。

Also for js/css/image urls there's handy function asset()

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

This creates an absolute url starting with /.

喜爱纠缠 2024-12-03 16:08:34

在 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);
}

In Symfony 5 and in the common situation of a controller method use the injected Request object:

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);
}
滥情哥ㄟ 2024-12-03 16:08:34

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

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

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

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:

<div id="sidebar">
  {% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>
花辞树 2024-12-03 16:08:34
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
自由如风 2024-12-03 16:08:34

在一种涉及多域应用程序的情况下,app.request.getHttpHost 帮助了我。它返回类似 example.comsubdomain.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 like example.com or subdomain.example.com (or example.com:8000 when the port is not standard). This was in Symfony 3.4.

归属感 2024-12-03 16:08:34

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

{{ site.url }}

希望这可以帮助那些仍在苦苦挣扎的人。

I tried all the options here but they didnt work for me.
Eventually I got it working using

{{ site.url }}

Hope this helps someone who is still struggling.

蹲墙角沉默 2024-12-03 16:08:33

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

{{ app.request.getBaseURL() }}

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

{{ app.request.getSchemeAndHttpHost() }}

This is now available for free in twig templates (tested on sf2 version 2.0.14)

{{ app.request.getBaseURL() }}

In later Symfony versions (tested on 2.5), try :

{{ app.request.getSchemeAndHttpHost() }}
作死小能手 2024-12-03 16:08:33

为什么需要获取这个 root url ?不能直接生成绝对URL吗?

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

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

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

{{ url('homepage') }}

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

Why do you need to get this root url ? Can't you generate directly absolute URL's ?

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

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 :

{{ url('homepage') }}

(homepage, or whatever you call it in your routing file).

暮倦 2024-12-03 16:08:33

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

{{ app.request.getSchemeAndHttpHost() }}

You can use the new request method getSchemeAndHttpHost():

{{ app.request.getSchemeAndHttpHost() }}
小ぇ时光︴ 2024-12-03 16:08:33

从 Symfony v2.1 到 v6.0+ 有效

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

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

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

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/webapp

注意: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 with getBaseUrl(), similar to how getUri() works, except without the router path and query string.

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

For example, if your Symfony website URL lives at https://www.stackoverflow.com/webapp/, then these two methods return these values:

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/webapp

Note: getBaseUrl() includes the script filename (ie /app.php) if it's in your URL.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文