Symfony2 - 在 TWIG 模板中获取当前 URL 或路由?

Posted

技术标签:

【中文标题】Symfony2 - 在 TWIG 模板中获取当前 URL 或路由?【英文标题】:Symfony2 - Get the current URL or route in TWIG template? 【发布时间】:2015-05-08 22:01:18 【问题描述】:

我的路线是

admin:
      path:     /admin/
      defaults:  _controller: CatalogWebBundle:Admin:admin 

如何在 php 模板中获取路由名称?

【问题讨论】:

我猜在twig中你可以使用app.request.attributes.get('_route')作为php模板你可以导出等效代码 【参考方案1】:

获取当前网址

$request->getRequestUri();app.request.uri

至于路由本身,最好的做法是将它作为参数注入到你的控制器中,参见the doc here。您可以使用$request->attributes->get('_route')app.request.attributes.get('_route'),但它并不可靠,例如won't work with forwards,因为您要转发到控制器,而不是路径。而且它真的只有meant for debugging purposes according to Fabien (@fabpot), the creator,所以我不会为了以后的升级而依赖它。

旁注

记得随时avoid $request->get(),所以不要$request->get('_route'),因为我在类似问题的一些答案中看到了

如果您不需要控制器的灵活性,最好 从适当的公共属性显式获取请求参数 而是(属性、查询、请求)

原因是它会查看所述公共属性(属性、查询和请求)而不是仅查看一个(属性),从而使其速度变慢

【讨论】:

尽可能使用 RequestStack:symfony.com/blog/new-in-symfony-2-4-the-request-stack 在服务中使用 RequestStack。请求是控制器的方式。【参考方案2】:

直接在 Twig 中做不是一件好事,但你仍然可以做。更好的方法是将它作为参数从控制器传递。

在 Twig 中获取路由参数。

 app.request.attributes.get('_route_params') 

在 Twig 中获取整个包名。

 app.request.attributes.get("_controller") 

在 Twig 中获取路线名称。

 app.request.attributes.get('_route') 

【讨论】:

【参考方案3】:

要在 Symfony2 中获取路由名称,请输入以下代码 sn-p

$request = $this->container->get('request');
$routeName = $request->get('_route');

在 Symfony2 中获取 URL,

$request = $this->container->get('request');
$routeURL = $request->getRequestUri();

【讨论】:

【参考方案4】:

补充一点,在某些情况下,app.request.uri 不会返回当前页面的 url。

示例:在您的页面模板中,您通过以下方式调用控制器:

 render(controller('AppBundle:MyController:myBlock')) 

myBlockAction 中,您渲染另一个模板,例如block.html.twig

block.html.twig 调用app.request.uri 将显示如下内容:

http://www.example.com/app.php/_fragment?_path=_format%3Dhtml%26_locale%3Dfr%26_controller%3DAppBundle%253AMyController%253AmyBlock

如果你想从block.html.twig内部获取渲染页面的绝对url,你可以从php $_SERVER 变量中重新组装它:

 app.request.server.get('REQUEST_SCHEME') ~ '://' ~ 
   app.request.server.get('SERVER_NAME') ~ 
   app.request.server.get('PHP_SELF') 

如果需要,您还可以添加QUERY_STRING

【讨论】:

【参考方案5】:

在 symfony5 上你可以这样做。

调用控制器块并传递当前 url:

 render_esi(controller('App\\Controller\\Frontend\\BlockController::social','pageUri': app.request.uri )) 

<?php

namespace App\Controller\Frontend;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class BlockController extends AbstractController 
    public function social($pageUri) 
        return $this->render('block/_social.html.twig', ['pageUri' => $pageUri]);
    


输出树枝: 'block/_social.html.twig'

<small>Current Url :  pageUri  </small>

【讨论】:

以上是关于Symfony2 - 在 TWIG 模板中获取当前 URL 或路由?的主要内容,如果未能解决你的问题,请参考以下文章

在 TWIG 模板中获取控制器名称

如何在 symfony2 中从数据库中渲染 Twig 模板

Symfony2 Assetic + Twig 模板 JavaScript 继承

Symfony2 twig 移动模板后备

Symfony2 在 Twig 中获取用户角色

Symfony2 中的 Twig CamelCase 过滤器