2013-01-03 7 views
7
if ($u = $this->generateUrl('_'.$specific.'_thanks')) 
    return $this->redirect($u); 
else 
    return $this->redirect($this->generateUrl('_thanks')); 

Non desidero reindirizzare all'URL _specific_thanks quando esiste. Quindi, come verificare se esiste un URL?Controllare l'URL prima di reindirizzare symfony2

Quando ho fatto questo, ho avuto questo errore:

Route "_specific_thanks" does not exist.

risposta

11

Io non credo che ci sia un modo diretto per verificare se esiste un percorso. Ma puoi cercare l'esistenza del percorso attraverso il servizio router.

$router = $this->container->get('router'); 

È possibile quindi ottenere un insieme di rotte e chiamare get() per un determinato percorso, che restituisce null se non esiste.

$router->getRouteCollection()->get('_'. $specific. '_thanks'); 
+0

Perfetto funziona per me! Solo '$ this-> container-> get ('router');' con symfony 2.1.4 – Harold

+0

Grande! Ho aggiornato la risposta in modo che si adatti a sf 2.1.4 :) $ this-> get ('router') funziona anche a mio avviso. –

-3

Prova questa:

if ($u == $this->generateUrl('_'.$specific.'_thanks')) 
+0

io davvero non so come questo possa risolvere il problema ... hai veramente capito il codice? – j0k

+0

Non ho esperienza con symfony2. Ho visto dentro se la condizione ha messo un incarico, quindi ho pensato che potesse essere il problema. Non so cosa restituisce la funzione $ this-> generateUrl(). – gezimi005

+0

Hai visto che il compito è usato all'interno della condizione? Quindi usando '===' rimuovi il compito ... – j0k

1

provare qualcosa di simile, controllare il percorso esiste nella matrice di tutti i percorsi:

$router = $this->get('router'); 

    if (array_key_exists('_'.$specific.'_thanks',$router->getRouteCollection->all())){ 
     return $this->redirect($this->generateUrl('_'.$specific.'_thanks')) 
    } else { 
     return $this->redirect($this->generateUrl('_thanks')); 
    } 
+0

Anche troppo veloce. Ma invece di 'in_array ('', array_keys())' Potresti semplicemente fare 'if (array_key_exists ('_'. $ Specifico .'_ grazie ', $ router-> getRouteCollection() -> all())' – Touki

+0

' -> tutto() 'è performance killer –

+0

@AlainTiemblo Non sono sicuro che sia davvero un killer delle prestazioni, la soluzione di @ ahmedSiouani è più ordinata ma il codice fa quasi la stessa cosa, solo" isset "piuttosto che" array_key_exists ". Vedi https: //github.com/symfony/symfony/blob/2.8/src/Symfony/Component/Routing/RouteCollection.php#L93 per come funziona 'all'. Il vero killer delle prestazioni è' getRouteCollection' mentre carica i percorsi se sono non ancora caricato https://github.com/symfony/symfony/blob/2.8/src/Symfony/Component/Routing/Router.php#L190 questo ci ha causato alcuni problemi di prestazioni reali in un progetto :) – Luke

0

Hai controllato il cast? E sei sicuro del percorso? di solito il percorso inizia con

'WEBSITENAME_'.$specific.'_thanks'

8

utilizzando getRouteCollection() su runtime è non la soluzione corretta. L'esecuzione di questo metodo richiederà la ricostruzione della cache. Ciò significa che la cache di routing verrà ricostruita su ogni richiesta, rendendo l'app molto più lenta del necessario.

Se si vuole verificare se esiste o no un percorso, utilizzare il costrutto try ... catch:

use Symfony\Component\Routing\Exception\RouteNotFoundException; 

try { 
    dump($router->generate('some_route')); 
} catch (RouteNotFoundException $e) { 
    dump('Oh noes, route "some_route" doesn't exists!'); 
}