Jak uzyskać aktualną trasę w Symfony 2?Jak uzyskać aktualną trasę w Symfony 2?
Na przykład routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Jak mogę uzyskać tę wartość somePage
?
Jak uzyskać aktualną trasę w Symfony 2?Jak uzyskać aktualną trasę w Symfony 2?
Na przykład routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Jak mogę uzyskać tę wartość somePage
?
Od czegoś, co jest ContainerAware (jak kontroler):
$request = $this->container->get('request');
$routeName = $request->get('_route');
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();
Rozwiązałem to samodzielnie. W widoku: '$ view ['request'] -> getParameter ('_ route');' – alexismorin
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ć. –
z gałązką: {{ app.request.attributes.get('_route') }}
Dziękujemy! Używam '
" do zastosowania css specyficznego dla strony :) –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
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) { ... }
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
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
myślę, że to jest najprostszym sposobem, aby to zrobić:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
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
@charlie http://symfony.com/doc/master/book/routing.html#route-parameters-and-controller-arguments – wdev
@Charlie Jest to predefiniowana zmienna, która podaje dopasowaną trasę "nazwa" – supernova
$request->attributes->get('_route');
można uzyskać nazwę trasy z obiektu żądania od wewnątrz sterownika.
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.
Więc ... jak twoje rozwiązanie nie działa dokładnie we wszystkich przypadkach użycia? – greg0ire
Łamie ESI, ale poza tym działa we wszystkich przypadkach. –
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') }}
Nie zaleca się użycia '' 'request-> get()' '' bezpośrednio, ponieważ jest wolne: https://github.com/symfony/http-foundation/blob/2.8/Request.php#L712 –
_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.
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
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 ^^ ' –
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. –
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;
}
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
?>
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>
@got w switchwation na sprawdzeniu http://meta.stackexchange.com/questions/155258/i-found-answers-for-a-question-not-really-correct-what-i-should -do –
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
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