在我的控制器中,我有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。
我想做什么可能吗?感谢您的支持!!
答案 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在调用控制器方法后要进行任何后处理,它就可以做到。