【问题标题】:Symfony2 - get main request's current route in twig partial/subrequestSymfony2 - 在树枝部分/子请求中获取主请求的当前路由
【发布时间】:2025-12-03 04:20:23
【问题描述】:

在单独控制器渲染的 Twig 部分中,我想检查当前主路由是否等于比较路由,因此我可以将列表项标记为活动。

我该怎么做?尝试在 BarController 中获取当前路由,例如:

$route = $request->get('_route');

返回null

Uri 也不是我要找的,因为在bar 的树枝中调用以下代码:

app.request.uri

返回路线类似于:localhost/_fragment?path=path_to_bar_route

完整示例

主控制器: FooController 扩展了控制器{

    public function fooAction(){}
}

fooAction 树枝:

...some stuff...

{{ render(controller('FooBundle:Bar:bar')) }}

...some stuff...

条形控制器:

BarController extends Controller{

    public function barAction(){}
}

barAction 树枝:

<ul>   
    <li class="{{ (item1route == currentroute) ? 'active' : ''}}">
        Item 1
    </li>
    <li class="{{ (item2route == currentroute) ? 'active' : ''}}">
        Item 2
    </li>
    <li class="{{ (item3route == currentroute) ? 'active' : ''}}">
        Item 3
    </li>  
</ul>

【问题讨论】:

    标签: php symfony twig


    【解决方案1】:

    pabgaran 的解决方案应该有效。但是,最初的问题可能是因为request_stack

    http://symfony.com/blog/new-in-symfony-2-4-the-request-stack

    由于您处于子请求中,因此您应该能够获得* (master) Request_route。像这样的:

    public function barAction(Request $request) {
        $stack = $this->get('request_stack');
        $masterRequest = $stack->getMasterRequest();
        $currentRoute = $masterRequest->get('_route');
    
        ...
        return $this->render('Template', array('current_route' => $currentRoute );
    }
    

    还没有运行,但它应该可以工作......

    【讨论】:

      【解决方案2】:

      我认为在你的情况下最好的解决方案是超越渲染中的当前主要路线:

      {{ render(controller('FooBundle:Bar:bar', {'current_route' : app.request.uri})) }}
      

      接下来,在响应中返回:

      public function barAction(Request $request) {
          ...
          return $this->render('Template', array('current_route' => $request->query->get('current_route'));
      }
      

      并在您的模板中与收到的值进行比较。

      否则,如果您不需要为部分添加额外的逻辑,那么使用包含而不是渲染可能会更好。

      【讨论】:

        【解决方案3】:

        在树枝中,您可以将请求对象从主控制器发送到子控制器作为参数:

        {{ render(controller('FooBundle:Bar:bar', {'request' : app.request})) }}
        

        在子控制器中:

        BarController extends Controller{
        
            public function barAction(Request $request){
        // here you can use request object as regular
        $country = $request->attributes->get('route_country');
        }
        }
        

        【讨论】: