2015-05-11 3 views
5

Im Zweig teilweise von separaten Controller gerendert, möchte ich überprüfen, ob aktuelle Hauptroute gleich verglichen Route, so dass ich Listenelement als aktiv markieren kann.Symfony2 - Holen Sie sich die aktuelle Route der Hauptanfrage im Zweig Teil-/Unteranfrage

Wie kann ich das tun? Der Versuch, die aktuelle Route in BarController zu bekommen:

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

kehrt null.

Uri ist auch nicht das, was ich suche, wie im folgenden Code in bar ‚s Zweig Aufruf:

app.request.uri 

kehrt Route ähnlich wie: localhost/_fragment?path=path_to_bar_route

Voll Beispiel

Hauptcontroller: FooController erweitert Controller {

public function fooAction(){} 
} 

fooAction Zweig:

...some stuff... 

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

...some stuff... 

Bar Controller:

BarController extends Controller{ 

    public function barAction(){} 
} 

barAction Zweig:

<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> 

Antwort

12

pabgaran Lösung sollte funktionieren. Das ursprüngliche Problem tritt jedoch wahrscheinlich aufgrund der request_stack.

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

Da Sie in einem subrequest sind, sollten Sie in der Lage sein Top-Level zu bekommen (master) Request und _route zu bekommen. Etwas wie das:

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

Ich habe das nicht ausgeführt, aber es sollte funktionieren ...

2

Ich denke, dass die beste Lösung in Ihrem Fall ist vorbei an der aktuellen Hauptroute im Putz:

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

Als nächstes bringen Sie es in der Antwort:

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

Und in Ihrer Vorlage vergleicht mit dem empfangenen Wert.

Ansonsten ist es vielleicht besser, ein Include statt ein Render zu verwenden, wenn Sie keine zusätzliche Logik für die Partiellen benötigen.

+1

Dank für das Bearbeiten, @ A. L. – pabgaran

1

in Zweig können Sie Request-Objekt von Hauptsteuerung zu Sub-Controller als Parameter senden:

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

in Sub-Controller:

BarController extends Controller{ 

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