2 Symfony路由具有相同的模式,如何?

时间:2016-04-18 14:47:58

标签: symfony url routing

我陷入了一个问题,无法摆脱它。

我有两个看起来相同的网址,但应该路由到不同的控制器。

  1. mysite.com/ {alias} =>将采取mysite.com/contact; mysite.com/about...etc 控制器:AppBundle:默认:page.html.twig

  2. mysite.com/ {alias} =>我将在我的数据库中列出我的商店列表。示例:mysite.com/ebay; mysite.com/apple...etc 控制器:AppBundle:购物:index.html.twig

  3. 你会怎么做?

    提前致谢

1 个答案:

答案 0 :(得分:3)

使用相同的模式不是一个好主意,因为Symfony将尝试按照您在routing.yml中定义的顺序逐个匹配所有路由。因此,当第一个模式匹配时,第二个模式将始终被忽略。

我建议您对模式更准确:您应该为静态页面(/ contact,/ about等)设置确切的模式,并为每个模式设置控制器操作。如果您不想要,可以在单个操作上定义多个@Route注释,或者将requirements定义为单个@Route注释。 (如@Route("/{alias}", requirements={"alias"="(contact|about)"}

然后,您可以为商店列表设置回退模式/{alias}

修改 我们的目标是,不是只有一个正则表达式来匹配你的所有情况,而是拥有其中几个,但具有你已经拥有的相同行为。

如果您以这种方式定义路由(按照确切的顺序):

1. /contact => Contact action
2. /about => About action
3. /{alias} => Shop action (matches every other URL than /contact and /about, like /amazon, /ebay, etc.)

然后这应该按照你的意愿运作。

如果用户访问 yoursite.com/contact ,则第一个模式将匹配,因此用户将看到联系人页面。

如果用户访问 yoursite.com/about ,则第一个模式将失败,但第二个模式将匹配,因此用户将看到关于页面。

如果用户访问 yoursite.com/ebay ,则第一个和第二个模式将失败,但第三个模式将匹配,因此用户将看到与"ebay" slug关联的商店页面