2011-08-17 7 views

Odpowiedz

274

Od czegoś, co jest ContainerAware (jak kontroler):

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

@got w switchwation na sprawdzeniu http://meta.stackexchange.com/questions/155258/i-found-answers-for-a-question-not-really-correct-what-i-should -do –

+26

github.com/symfony/symfony/issues/854 request.attributes.get ('_ route') nie jest niezawodny, ponieważ jest przeznaczony wyłącznie do celów debugowania (symfony dev powiedział) i nie działa, jeśli żądanie zostanie przekazane ... zobacz odpowiedź supernowej, która jest udokumentowana i jest bardziej odporna na awarie. – luiges90

+3

Powód, dla którego nie działa, gdy coś jest przekazywane, wynika z faktu, że przekazujesz bezpośrednio do kontrolera, a nie trasy. W związku z tym Symfony nie wie do jakiej trasy służy. Zazwyczaj masz jedną trasę do jednego kontrolera, więc może wydawać się dziwne, że nie może ona zgłosić niczego poza "_internal", jednak możliwe jest tworzenie kontrolerów ogólnego zastosowania, które są powiązane z więcej niż jedną definicją trasy. Kiedy weźmiesz pod uwagę to wszystko, myślę, że to "gotcha" ma więcej sensu. – jzimmerman2011

4

Wszystko Dostaję od to _internal

uzyskać nazwę trasy od wewnątrz kontrolera z $this->getRequest()->get('_route'). nawet kod tuxedo25 zasugerował zwroty _internal

Ten kod jest wykonywany w tak zwanym "komponencie" w Symfony 1.X; Nie kontroler strony, ale część strony, która wymaga pewnej logiki.

Odpowiednik kodu w Symfony 1.X jest: sfContext::getInstance()->getRouting()->getCurrentRouteName();

+2

Rozwiązałem to samodzielnie. W widoku: '$ view ['request'] -> getParameter ('_ route');' – alexismorin

+5

dzieje się tak, ponieważ używasz '{% render ...%}' połączeń z 'standalone = true'. Z buforowaniem (AppCache.php lub lakier z ESI) włączony, spowoduje to, że żądane będą osobne widoki z osobnym żądaniem HTTP (tutaj zaczyna się ścieżka '_wewnętrzna'), aby można było niezależnie buforować. –

183

z gałązką: {{ app.request.attributes.get('_route') }}

+7

Dziękujemy! Używam '" do zastosowania css specyficznego dla strony :) –

+9

github.com/symfony/symfony/issues/854 request.attributes.get ('_ route') nie jest niezawodny, ponieważ jest przeznaczony tylko do celów debugowania (symfony dev powiedział) i nie działa, jeśli żądanie jest przekazywane ... zobacz odpowiedź supernowy, która jest udokumentowana i są bardziej odporne na awarie – luiges90

25

Symfony 2,0-2,1
Użyj tego:

$router = $this->get("router"); 
    $route = $router->match($this->getRequest()->getPathInfo()); 
    var_dump($route['_route']); 

Że jeden nie będzie daje _internal.

Aktualizacja dla Symfony 2.2+: To nie działa, począwszy od Symfony 2.2+. Otworzyłem bug, a odpowiedź brzmiała "według projektu". Jeśli chcesz dostać trasę w poddziałania, należy przekazać go jako argument

{{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') })) }} 

i kontroler:

public function menuAction($route) { ... } 
+0

https://github.com/symfony/symfony/issues/854 Nie jestem tego pewien, '$ route ['_ route']' wydaje się problematyczne, ale może nie być symfony dev opowiada o. Książka kucharska nie wspomina o '_route' z' $ router-> match() 'output .. – luiges90

+0

W pełni zgadzam się z @ luiges90. PHPDoc '$ router-> match()' mówi "@return array Tablica parametrów", która wydaje się _very_ wewnętrzna. Nie chcę na niej polegać, ale teraz wydaje się, że jest to jedyne możliwe rozwiązanie w przypadku wniosków podrzędnych. – netmikey

44

myślę, że to jest najprostszym sposobem, aby to zrobić:

class MyController extends Controller 
{ 
    public function myAction($_route) 
    { 
     var_dump($_route); 
    } 

    ..... 
+2

Czy możesz dodać więcej wyjaśnień lub pokazać przykładowe dane wyjściowe, aby wyjaśnić, w jaki sposób rozwiązuje to problem? – Charlie

+7

@charlie http://symfony.com/doc/master/book/routing.html#route-parameters-and-controller-arguments – wdev

+1

@Charlie Jest to predefiniowana zmienna, która podaje dopasowaną trasę "nazwa" – supernova

7
$request->attributes->get('_route'); 

można uzyskać nazwę trasy z obiektu żądania od wewnątrz sterownika.

17

Nie ma rozwiązania, które działa we wszystkich przypadkach użycia. Jeśli użyjesz metody $ request-> get ('_ route') lub jej wariantów, , zwróci ona "_internal" dla przypadków, w których miało miejsce przekazanie.

Jeśli potrzebne jest rozwiązanie, które działa nawet przy spedycji, trzeba korzystać z nowej usługi RequestStack, że przybył w 2.4, ale to złamie ESI support:

$requestStack = $container->get('request_stack'); 
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI 
if ($masterRequest) { 
    echo $masterRequest->attributes->get('_route'); 
} 

Można dokonać rozszerzenia gałązka z tego, jeśli potrzebujesz go w szablonach.

+0

Więc ... jak twoje rozwiązanie nie działa dokładnie we wszystkich przypadkach użycia? – greg0ire

+1

Łamie ESI, ale poza tym działa we wszystkich przypadkach. –

-1

jeśli chcesz uzyskać nazwę trasy w kontrolerze niż trzeba wstrzyknąć żądanie (zamiast się z pojemnika z powodu Symfony UPGRADE i niż wywołania get („_ trasy”).

public function indexAction(Request $request) 
{ 
    $routeName = $request->get('_route'); 
} 

jeśli chcesz aby uzyskać nazwę trasy w gałązka niż trzeba zdobyć jak

{{ app.request.attributes.get('_route') }} 
+1

Nie zaleca się użycia '' 'request-> get()' '' bezpośrednio, ponieważ jest wolne: https://github.com/symfony/http-foundation/blob/2.8/Request.php#L712 –

9

_route nie jest droga i nigdy nie było. It was always meant for debugging purposes według Fabien który stworzył Symfony. jest unreliab le, ponieważ nie będzie działać z przesyłaniem danych i innymi bezpośrednimi połączeniami z kontrolerami, takimi jak częściowe renderowanie.

Trzeba wprowadzić nazwę swoją trasę jako parametr w kontrolerze, see the doc here

Ponadto prosimy nie używać $request->get(''); jeśli nie potrzebują elastyczności to jest sposób wolniej niż przy użyciu dostać od konkretnego worka własności, które potrzeba (atrybuty, zapytanie lub prośba), więc $request->attributes->get('_route'); w tym przypadku.

+1

Ok , zasadniczo sugerujesz, aby dodawać dodatkowe informacje do każdej trasy w tych plikach, zamiast otrzymywać nazwę trasy? ... Ten sposób myślenia i odpowiadanie na walkę ludzi jest jednym z powodów, dla których coraz więcej osób nienawidzi symfonii. – Charaf

+1

Tak, zwłaszcza jeśli musisz mieć możliwość wywołania samego kontrolera w późniejszym wierszu (przekazywanie, częściowe renderowanie, itp.), Podanie nazwy jako parametru jest jedyną drogą, ponieważ w ogóle nie wywołujesz trasy ta walizka. Jeśli chodzi o to, że _route jest przeznaczony do celów debugowania, nie rób tego na mnie ^^ ' –

+0

Możesz również zawsze zaimplementować własny program nasłuchujący nazwy trasy lub prosty serwis w zależności od tego, jak potrzebujesz go globalnie, dodając detektor żądań, w którym przeanalizuj adres URL, aby znaleźć nazwę trasy, ale wydaje mi się, że jest to dla mnie ciężkie i nadal nie będzie działało z przesyłaniem dalej i takimi. –

0

Aby uzyskać bieżącej trasy na podstawie adresu URL (bardziej wiarygodne w przypadku forward):

public function getCurrentRoute(Request $request) 
{ 
    $pathInfo = $request->getPathInfo(); 
    $routeParams = $this->router->match($pathInfo); 
    $routeName = $routeParams['_route']; 
    if (substr($routeName, 0, 1) === '_') { 
     return; 
    } 
    unset($routeParams['_route']); 

    $data = [ 
     'name' => $routeName, 
     'params' => $routeParams, 
    ]; 

    return $data; 
} 
2

dla nikogo, że potrzebują aktualnej trasy dla Symfony 3, to co używam

<?php 
    $request = $this->container->get('router.request_context'); 
    //Assuming you are on user registration page like https://www.yoursite.com/user/registration 
    $scheme = $request->getScheme(); //This will return https 
    $host = $request->getHost(); // This will return www.yoursite.com 
    $route = $request->getPathInfo(); // This will return user/registration(don't forget this is registrationAction in userController 
?> 
2

Z Symfony 3.3, użyłem tej metody i działa dobrze.

Mam 4 trasy jak

admin_category_index, admin_category_detail, admin_category_create, admin_category_update

I tylko jedna linia uczynić aktywną klasę na wszystkich trasach.

<li {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}> 
<a href="{{ path('admin_category_index') }}">Product Categoires</a> 
</li>