it-swarm-eu.dev

Come ottenere il percorso corrente in Symfony 2?

Come posso ottenere il percorso corrente in Symfony 2?

Ad esempio, routing.yml:

somePage:
   pattern: /page/
   defaults: { _controller: "AcmeBundle:Test:index" }

Come posso ottenere questo valore somePage?

212
IlyaDoroshin

Da qualcosa che è ContainerAware (come un controller):

$request = $this->container->get('request');
$routeName = $request->get('_route');
310
tuxedo25

Con Twig: {{ app.request.attributes.get('_route') }}

189
Matthieu

Penso che questo sia il modo più semplice per farlo:

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

    .....
47
supernova

Symfony 2.0-2.1
Usa questo:

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

Quello non ti darà _internal.

Aggiornamento per Symfony 2.2 +: Questo non funziona avviando Symfony 2.2+. Ho aperto un bug e la risposta era "in base alla progettazione". Se desideri ottenere il percorso in un'azione secondaria, devi passarlo come argomento

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

E il tuo controller:

public function menuAction($route) { ... }
27
jsgoupil

Non esiste una soluzione che funzioni per tutti i casi d'uso. Se si utilizza il metodo $ request-> get ('_ route') o le sue varianti, restituirà '_internal' per i casi in cui è avvenuto l'inoltro.

Se hai bisogno di una soluzione che funzioni anche con l'inoltro, devi utilizzare il nuovo servizio RequestStack, che è arrivato in 2.4, ma questo si interromperà supporto ESI:

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

Puoi creare un'estensione di ramoscello se ne hai bisogno nei modelli.

19
K. Norbert

_route non è la strada da percorrere e non è mai stato . Era sempre pensato per scopi di debug secondo Fabien che ha creato Symfony. È inaffidabile in quanto non funzionerà con cose come l'inoltro e altre chiamate dirette a controllori come il rendering parziale.

Devi inserire il nome della tua rotta come parametro nel tuo controller, vedi il documento qui

Inoltre, per favore non usare mai $request->get(''); se non hai bisogno della flessibilità è molto più lento dell'usare il sacchetto di proprietà specifico di cui hai bisogno (attributi, query o richiesta) così $request->attributes->get('_route'); in questo caso.

11
Tom Toms
$request->attributes->get('_route');

È possibile ottenere il nome della rotta dall'oggetto richiesta all'interno del controller.

7
Venkat Kotra

Tutto quello che sto ricevendo è _internal

Ricevo il nome della rotta dall'interno di un controller con $this->getRequest()->get('_route'). Anche il codice tuxedo25 ha restituito _internal

Questo codice viene eseguito in quello che è stato chiamato un "Componente" in Symfony 1.X; Non il controller di una pagina, ma parte di una pagina che ha bisogno di logica.

Il codice equivalente in Symfony 1.X è: sfContext::getInstance()->getRouting()->getCurrentRouteName();

4
alexismorin

Con Symfony 3.3, ho usato questo metodo e lavorando bene.

Ho 4 percorsi come

admin_category_index, admin_category_detail, admin_category_create, admin_category_update

E solo una riga crea una classe attiva per tutti i percorsi.

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

Per ottenere il percorso corrente in base all'URL (più affidabile in caso di 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;
}
1
Alain Tiemblo

Per chiunque abbia bisogno di un percorso attuale per Symfony 3, questo è quello che uso

<?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
?>
1
Aderemi Dayo

Con Symfony 4.2.7, sono in grado di implementare quanto segue nel mio modello di ramoscello, che mostra il nome del percorso personalizzato che ho definito nei miei controller.

In index.html.twig

<div class="col">
    {% set current_path =  app.request.get('_route') %}
    {{ current_path }}
</div>

Nel mio controller


    ...

    class ArticleController extends AbstractController {
        /**
         * @Route("/", name="article_list")
         * @Method({"GET"})
         */
        public function index() {
        ...
        }

        ...
     }

Il risultato stampa "article_list" sulla pagina desiderata nel mio browser.

0
klewis