【问题标题】:Get current URL in Twig template?在 Twig 模板中获取当前 URL?
【发布时间】:2012-02-21 13:49:27
【问题描述】:

我四处寻找代码以获取 Twig 模板中的当前路径(而不是完整的 URL),即 我不要http://www.sitename.com/page,我只需要/page

【问题讨论】:

  • 这不是完全重复的,因为答案 #2 包含链接问题未提供的必要信息(关于请求参数)。应该将答案 #2 合并到链接的问题中。
  • 试试 app.request.requestUri.
  • 根本不是骗子。投票重新开放。将我的答案作为评论发布,因为我现在不允许回答...{{ app.request.getBaseUrl ~ app.request.getPathInfo }}getBaseUrl 位是可选的;仅在未安装到域的根目录时才需要)

标签: symfony twig


【解决方案1】:

获取当前网址{{ app.request.uri }} in Symfony 2.3、3、4、5


获取仅路径{{ app.request.pathinfo }}(不带参数)


获取请求uri{{ app.request.requesturi }}(带参数)

【讨论】:

  • 这是唯一对我有用的。所有其他人都错过了不属于路由的查询参数,或者依赖于控制器而不是 Twig。
  • 要获取路径,请尝试{{ app.request.pathinfo }} 或查看/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php 中的可用方法列表
  • 这应该是正确的答案。短而流畅。
  • uri 获取带参数的 URL。 pathinfo 获取带有 NO 参数的路径。 requestUri 获取路径 WITH 参数。 requestUri 应该添加到这个答案 IMO 中。您很少需要域,也很少需要删除参数。
  • 如果您在反向代理/负载均衡器后面,请确保在config/packages/framework.yaml(Symfony 5.2+)中正确设置trusted_{proxies,hosts,headers}。还要确保您的反向代理/负载均衡器将 X-Forwarded-{For,host,Proto,Port} 标头发送到 Symfony。
【解决方案2】:
{{ path(app.request.attributes.get('_route'),
     app.request.attributes.get('_route_params')) }}

如果要将其读入视图变量:

{% set currentPath = path(app.request.attributes.get('_route'),
                       app.request.attributes.get('_route_params')) %}

app 全局视图变量包含各种有用的快捷方式,例如 app.sessionapp.security.token.user,它们引用您可能在控制器中使用的服务。

【讨论】:

  • 很遗憾,如果您的路由带有强制参数,这将不起作用。
  • 如果你在没有 Symfony 的情况下使用 Twig,你可以这样做: $twig->addGlobal("CurrentUrl", $_SERVER["REQUEST_URI"]);
  • 如果你的路由有强制参数,见the answer below
  • @GateKiller 这使我的功能测试失败:Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
  • 感谢您的精彩回答,非常有帮助!
【解决方案3】:

您可以像这样在 Twig 中获取当前 URL:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}

【讨论】:

    【解决方案4】:

    需要注意的是,如果您的 URL 中有额外的查询参数,这些参数 不是 配置的路由的一部分,则接受的答案不会将它们包含在当前 URL(路径)中。

    为什么需要额外的参数?

    例如,如果您有一个包含可以按关键字过滤的记录的列表页面,并且该页面具有分页功能,则“关键字”和“页面”的查询变量很可能不会在您的路由中。但是在用于分页的前进和后退按钮中,您需要完整的当前 URL(包含关键字,因此仍会过滤下一页)。并且需要修改page变量。

    如何合并额外的查询参数

    因此您可以获得当前路线,并合并额外变量(在修改一个或多个额外变量之后)。请注意,您将自己的变量合并到app.request.query.all,然后将该数组合并到app.request.attributes.get('_route_params')path() 方法要求您提供路由的所有必需参数,这就是为什么您需要包含_route_params

    {{ path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')|merge(app.request.query.all|merge({'page': 2 }))) }}

    这真的很难看,但是如果您正在开发分页,则需要修改每个单独链接上的 page 变量,因此您必须每次都包含整个内容。也许其他人有更好的解决方案。

    【讨论】:

    • 应该是{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
    【解决方案5】:

    使用 Symfony 5,您可以这样使用:

    {{ app.request.uri }}
    

    【讨论】:

      【解决方案6】:

      在 symfony 2.1 中你可以使用这个:

      {{ path(app.request.attributes.get('_route'), 
              app.request.attributes.get('_route_params')) }}
      

      在 symfony 2.0 中,一种解决方案是为此编写一个 twig 扩展

      public function getFunctions()
      {
          return array(
              'my_router_params' => new \Twig_Function_Method($this, 'routerParams'),
          );
      }
      
      /**
       * Emulating the symfony 2.1.x $request->attributes->get('_route_params') feature.
       * Code based on PagerfantaBundle's twig extension.
       */
      public function routerParams()
      {
          $router = $this->container->get('router');
          $request = $this->container->get('request');
      
          $routeName = $request->attributes->get('_route');
          $routeParams = $request->query->all();
          foreach ($router->getRouteCollection()->get($routeName)->compile()->getVariables() as $variable) {
              $routeParams[$variable] = $request->attributes->get($variable);
          }
      
          return $routeParams;
      }
      

      并像这样使用

      {{ path(app.request.attributes.get('_route'), my_router_params()|merge({'additional': 'value'}) }}
      

      除非您想在链接中添加其他参数,例如在寻呼机中,或者您想更改其中一个参数,否则您不需要所有这些。

      【讨论】:

      • 如果你想在 Twig 中生成当前链接并改变语言切换的语言环境,可以在 Symfony 2.1 中完成如下: {{ path(app.request.attributes.get('_route '), app.request.attributes.get('_route_params')|merge({'_locale': 'ja'})) }} 如果您使用 Bártfai Tamás 的 Twig 扩展,它可能会起作用
      • 对于您的 2.0 实现,我收到一条错误消息,指出没有容器。所以我像在 PagerfantaBundle 中一样添加了变量,但是它说我必须实现 ContainerInterface?
      • 你必须为这个扩展创建一个构造函数,它有一个 $container 参数。然后在 DIC 配置中,您必须将容器声明为扩展的参数。 Like here in the TwigBundle
      • 如果您的查询字符串中有一些额外的参数,_route_parameters 将不起作用。您可以改用 app.request.query.all。
      【解决方案7】:

      如果您使用的是 Silex 2,则无法再访问 Request 对象。

      您可以通过这种方式访问​​当前的请求属性。

      app.request_stack.currentrequest.attributes.get('_route')
      

      并生成完整的当前 URL: path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))

      【讨论】:

      • 您可以像这样在 Twig/Silex 2 中获取当前 URL:global.request.attributes.get('_route')Twig bridge 是必填项。
      猜你喜欢
      • 2012-03-09
      • 2015-05-08
      • 2023-03-29
      • 1970-01-01
      • 2019-09-04
      • 2011-02-22
      相关资源
      最近更新 更多