Symfony2路由:如何设置默认值

时间:2014-08-21 18:08:39

标签: php symfony routing annotations

在我的控制器中,我有2个带注释的操作:

/**
     * Lists all Mains entities.
     *
     * @Route("/{lang}/{main_name}", defaults={"lang" = "de"})
     * @Method("GET")
     * @Template()
     */
    public function mainAction($lang,$main_name)
    {
        $em = $this->getDoctrine()->getManager();
        $entity = $em->getRepository('MyWebsiteBundle:Main')->findOneBy(array('name'=>$main_name));
        echo $entity->getContent();

        die;

    }

    /**
     * Lists all Branches.
     *
     * @Route("/{lang}/{branch}/b{id}", defaults={"lang" = "de"})
     * @Method("GET")
     * @Template()
     */
    public function branchAction($lang,$id)
    {
        $em = $this->getDoctrine()->getManager();
        $entity = $em->getRepository('MyWebsiteBundle:Branch')->find($id);
        echo $entity->getMain()." > ".$entity->getName()."<br><br>";
        echo $entity->getContent();

        die;

    }

当我在没有“lang”的情况下调用mainAction链接时:例如:“localhost / contact”而不是“localhost / en / contact”它工作正常,网站“contact”被调用。

但是当我将branchAction称为“localhost / products / b2”而不是“localhost / en / products / b2”时,我收到错误,因为我认为它被称为mainAction。

我想做什么可能吗?感谢您的支持!!

1 个答案:

答案 0 :(得分:0)

这听起来像是您的要求的简化版本:

  • 如果网址不以/[a-z]{2}/开头,则重写网址,将/de/添加到原始路径。
  • 如果网址以/[a-z]{2}/开头,则请正常处理。

如果是这种情况,那么将其作为第一个控制器操作可能会有效:

/**
 * @Route("/{path}", name = "rewrite", requirements = { "path" = "[a-zA-Z]{3,}" })
 */
public function rewriteAction($path) {

    $defaultLanguage = "de";

    return $this->redirect("$defaultLanguage/$path");

}

如果路径以3个字母开头(即超过2个字母),则使用requirements字段指示Symfony仅使用此路由。

您需要处理一些细微差别(删除额外的斜杠,处理像/a/这样的单字符路径,使用/t5等数字处理路径,但我认为这可能是一个好的开始。

您也可以在服务器级别处理此问题,例如使用Apache URL重定向。

最后,请不要在控制器方法中echo $content;die;。这违背了拥有MVC框架的目的。相反,您应该使用return new Response($content);。这样,如果Symfony在调用控制器方法后要进行任何后处理,它就可以做到。