2016-11-24 109 views
1

我通過render函數從base.twig文件呈現header.twig。所以在我的base.twig有以下代碼來觸發頭控制器:Symfony2 app.request.get在呈現的樹枝模板中返回null

{{ render(controller('MyBundle:Global:header')) }} 

該控制器呈現header.twig。在這個枝杈文件中有下面的代碼鏈接更改語言:

<a href="{{ path(app.request.get('_route'), app.request.get('_route_params')|merge({'_locale' : app.request.locale })) }}"><img src="{{ asset('flags/'~app.request.locale~'.png', 'img') }}" /></a> 

的物體形成app.request.get(「_路線」)和app.request.get(「_ route_params」)都返回null。

app.request.get('_route') 

如果我直接在base.twig運行相同的代碼鏈接請求返回正確的對象。看起來像是因爲header.twig有自己的控制器,請求不起作用。是否有可能以其他方式請求活動網址的路由和參數?

+0

使用'app.request.get( '_ route_params',{})'這樣,如果沒有'_route_params'它會默認爲emty對象。 – qooplmao

+0

這有助於消除錯誤,我只需要這些值,因爲這些值應該在應用程序中可用。這些是標準路由網址和url中的參數。 – Tom

回答

2

添加到@ Gustek的答案,因爲我錯過了在第一種情況中的實際問題。

您實際上正在呈現子請求,因此_route_route_params來自子請求而不是主要請求。在使用控制器時,最簡潔的方法是從主請求中獲取參數,並將其作爲控制器調用中的參數傳入。你可以通過渲染調用來傳遞它們(就像@Gustek已經回答的那樣),但這意味着你會在每次調用時都這樣做,或者你可以將請求堆棧傳遞到樹枝會話中,但這將是不必要的額外工作。

public function headerAction(Request $request) 
{ 
    $masterRequest = $this->container->get('request_stack')->getMasterRequest(); 

    //... 

    return $this->render('MyBundle:Global:header.html.twig', [ 
     //... 
     '_route'  => $masterRequest->attributes->get('_route'), 
     '_route_params' => $masterRequest->attributes->get('_route_params'), 
    ]); 
} 
+0

謝謝,這也是一個不錯的解決方案和工作! – Tom

相關問題