Jak uzyskać aktualną trasę w Symfony 2?
Na przykład routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Jak mogę uzyskać tę somePage
wartość?
Jak uzyskać aktualną trasę w Symfony 2?
Na przykład routing.yml
:
somePage:
pattern: /page/
defaults: { _controller: "AcmeBundle:Test:index" }
Jak mogę uzyskać tę somePage
wartość?
Odpowiedzi:
Z czegoś, co jest ContainerAware (jak kontroler):
$request = $this->container->get('request');
$routeName = $request->get('_route');
Z gałązką: {{ app.request.attributes.get('_route') }}
<body class="{{ app.request.get('_route') | replace({'_' : '-'}) }}">
do stosowania css specyficznych dla strony :)
Myślę, że to najłatwiejszy sposób:
class MyController extends Controller
{
public function myAction($_route)
{
var_dump($_route);
}
.....
{% render "SomeBundle:SomeController:someAction" %}
, gdzie ponownie otrzymasz wartość „_internal”.
Symfony 2.0-2.1
Użyj tego:
$router = $this->get("router");
$route = $router->match($this->getRequest()->getPathInfo());
var_dump($route['_route']);
Tego ci nie da _internal
.
Aktualizacja dla Symfony 2.2+: To nie działa, uruchamiając Symfony 2.2+. Otworzyłem błąd i odpowiedź brzmiała „zgodnie z projektem”. Jeśli chcesz uzyskać trasę w podakcji, musisz podać ją jako argument
{{ render(controller('YourBundle:Menu:menu', { '_locale': app.request.locale, 'route': app.request.attributes.get('_route') } )) }}
A twój kontroler:
public function menuAction($route) { ... }
$route['_route']
wydaje się problematyczny, ale może nie być gadaniem deweloperów symfony. The Cookbook nie wspominając o _route
od $router->match()
wyjścia ..
$router->match()
mówi „@return array Tablica parametrów”, co wydaje się bardzo wewnętrzne. Nie chcę na tym polegać, ale w tej chwili wydaje się, że jest to jedyne realne rozwiązanie w przypadku pod-żądań.
Nie ma rozwiązania, które działałoby we wszystkich przypadkach użycia. Jeśli użyjesz metody $ request-> get ('_ route') lub jej wariantów, zwróci ona „_internal” w przypadkach, w których miało miejsce przekazywanie.
Jeśli potrzebujesz rozwiązania, które działa nawet przy przesyłaniu dalej, musisz skorzystać z nowej usługi RequestStack, która została dostarczona w wersji 2.4, ale spowoduje to przerwanie obsługi ESI :
$requestStack = $container->get('request_stack');
$masterRequest = $requestStack->getMasterRequest(); // this is the call that breaks ESI
if ($masterRequest) {
echo $masterRequest->attributes->get('_route');
}
Możesz zrobić z niego rozszerzenie gałązki, jeśli potrzebujesz go w szablonach.
_route
to nie jest droga i nigdy nie było . Zawsze był przeznaczony do debugowania według Fabiena, który stworzył Symfony. Jest zawodny, ponieważ nie będzie działał z takimi rzeczami, jak przekazywanie i inne bezpośrednie połączenia do kontrolerów, takie jak częściowe renderowanie.
Musisz wprowadzić nazwę trasy jako parametr w kontrolerze, zobacz dokument tutaj
Ponadto, nigdy nie używaj, $request->get('');
jeśli nie potrzebujesz elastyczności, ponieważ jest ona znacznie wolniejsza niż korzystanie z konkretnej torby właściwości, której potrzebujesz (atrybuty, zapytanie lub żądanie), więc $request->attributes->get('_route');
w tym przypadku.
$request->attributes->get('_route');
Nazwę trasy można uzyskać z obiektu żądania z poziomu kontrolera.
Wszystko, co z tego czerpię, to
_internal
Dostaję nazwę trasy z wnętrza kontrolera, $this->getRequest()->get('_route').
nawet kod tuxedo25 sugeruje 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.
Odpowiednikiem kodu w Symfony 1.X jest: sfContext::getInstance()->getRouting()->getCurrentRouteName();
$view['request']->getParameter('_route');
{% render... %}
połączeń z standalone=true
. Przy włączonym buforowaniu (AppCache.php lub lakier z ESI) spowoduje to żądanie niezależnych widoków z oddzielnym żądaniem HTTP (tutaj rozpoczyna się trasa _internal
), aby ro można było niezależnie buforować.
W Symfony 3.3 zastosowałem tę metodę i działałem dobrze.
Mam 4 trasy jak
admin_category_index, admin_category_detail, admin_category_create, admin_category_update
I tylko jedna linia tworzy aktywną klasę dla wszystkich tras.
<li {% if app.request.get('_route') starts with 'admin_category' %} class="active"{% endif %}>
<a href="{{ path('admin_category_index') }}">Product Categoires</a>
</li>
Aby uzyskać bieżącą trasę na podstawie adresu URL (bardziej niezawodne w przypadku przekazywania dalej):
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;
}
W Symfony 4.2.7 jestem w stanie zaimplementować następujące elementy w moim szablonie gałązki, który wyświetla niestandardową nazwę trasy zdefiniowaną w moich kontrolerach.
W index.html.twig
<div class="col">
{% set current_path = app.request.get('_route') %}
{{ current_path }}
</div>
W moim kontrolerze
...
class ArticleController extends AbstractController {
/**
* @Route("/", name="article_list")
* @Method({"GET"})
*/
public function index() {
...
}
...
}
Wynik wypisuje „article_list” na wybranej stronie w mojej przeglądarce.
Dla każdego, kto potrzebuje aktualnej trasy do Symfony 3, tego właśnie 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
$name = $request->get('_route'); // This will return the name.
?>
jeśli chcesz uzyskać nazwę trasy w swoim kontrolerze, musisz wstrzyknąć żądanie (zamiast pobierać z kontenera ze względu na Symfony UPGRADE i niż wywołać get ('_ route').
public function indexAction(Request $request)
{
$routeName = $request->get('_route');
}
jeśli chcesz uzyskać nazwę trasy w gałązce, niż musisz ją uzyskać
{{ app.request.attributes.get('_route') }}
$request->get()
bezpośrednio, ponieważ jest wolny: github.com/symfony/http-foundation/blob/2.8/Request.php#L712