在Twig模板中测试路由是否存在(Symfony 2)

9

我想从数据库中生成导航菜单,其中存储了我的路由名称作为链接目标。我的控制器仅从数据库获取所有必要的导航条目,并返回直接在我的twig模板中使用的行。

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

因此有可能出现没有路线导致错误500的情况。

我需要一种方法来检查指定名称的路线是否存在。我尝试使用{% if path('routeName') is defined %} ... {% endif %}进行测试,但这不起作用。

据我所知,我的控制器可以捕获Twig异常,但我只想让twig忽略无效的导航条目。有什么建议吗?


可能是Check url before redirect symfony2的重复问题。 - Wouter J
1个回答

15

您可以制作自定义Twig函数(查看此链接以获取更多信息)。该函数用于检查给定的名称是否是有效路由:

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;
}

但我不确定在数据库中处理导航是否是一个好主意。也许你最好使用其他办法?


谢谢,现在它可以工作了!那帮了我很多。缓存导航条目以减轻数据库负担将是下一步。 - csc
return null === $router->getRouteCollection()->get($name); 就足够好了。 :) - HelpNeeder
5
我会建议写成return null !== $router-> ... :) - ozahorulia
根据该评论,最好像@imanali的示例一样捕获异常:https://github.com/symfony/symfony-docs/issues/6710 - Remy Mellet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接