2013-06-21 28 views
8

Chcę wygenerować nawigację z mojej bazy danych, w której przechowuję nazwy moich tras jako cele linków. Mój kontroler pobiera z bazy danych wszystkie niezbędne wpisy nawigacyjne i zwraca wiersze, które są używane bezpośrednio w moim szablonie gałązki.Sprawdź, czy trasa istnieje w szablonie Twig (Symfony 2)

/** 
* @Route("/") 
* @Template() 
*/ 
public function myAction() { 
    $em = $this->getDoctrine()->getManager(); 
    $navi = $em->getRepository('myBundle:Navigation')->findAll(); 
    return array("navi" => $navi); 
} 

Istnieje więc możliwość, że trasa nie istnieje, co powoduje błąd 500.

muszę metodę sprawdzenia pogoda nazwana droga istnieje, czy nie. Próbowałem przetestować go za pomocą {% if path('routeName') is defined %} ... {% endif %}, ale to nie działa.

AFAIK mój kontroler może złapać Twig Wyjątki, ale chcę tylko gałązka do zignorować wpisy do nawigacji, które nie są prawidłowe. Dowolny pomysł?

+0

Możliwa duplikat [Sprawdź adres URL przed przekierować Symfony2] (http://stackoverflow.com/questions/14136484/check-url-before-redirect-symfony2) –

Odpowiedz

12

Możesz utworzyć niestandardową funkcję gałązki (sprawdź link this, aby uzyskać więcej informacji). Funkcja, która sprawdza, czy dana nazwa jest ważna trasa:

function routeExists($name) 
{ 
    // I assume that you have a link to the container in your twig extension class 
    $router = $this->container->get('router'); 
    return (null === $router->getRouteCollection()->get($name)) ? false : true; 
} 

Ale nie jestem pewien, że to dobry pomysł, aby obsługiwać nawigację w taki sposób (w bazie danych). Może lepiej skorzystasz z czegoś innego?

+0

Dzięki , teraz działa! To bardzo mi pomogło. Przechwytywanie wpisów nawigacyjnych w celu przejęcia obciążenia z bazy danych będzie kolejnym krokiem. – user2476294

+0

'return null === $ router-> getRouteCollection() -> get ($ name);' jest wystarczająco dobre. :) – HelpNeeder

+3

@HelpNeeder Powiedziałbym 'return null! == $ router-> ...' :) – Hast

0

Ponadto można sprawdzić:

$router = $this->container->get('router'); 
try { 
    dump($router->generate('HomePage')); 
} catch (RouteNotFoundException $e) { 
    dump('Oh noes, route "HomePage" does not exists!'); 
}