Symfony Propel 1.4第一条规则覆盖routing.yml中的下一条规则

时间:2012-08-23 22:15:40

标签: routing symfony-1.4

我在routing.yml

中有几个规则
homepage:
  url:   /
  param: { module: cars, action: index }

letters:
  url: /:letter
  class: sfPropelRoute
  options:
    model: MyCarmodelPeer
    type: object
  param:
    module: cars
    action: alphalist
    linkmode: "@letters"
  requirements:
    letter: "([A-Z])"
    sf_method: [get]

show:
  url: /:slug
  class: sfPropelRoute
  options:
    model: MyCarmodelPeer
    type: object
  param:
     module: cars
     action: view
  linkmode: "@show"
  requirements:
   slug: "([A-Z]|0-9)"
   sf_method: [get]


default:
   url:   /:module/:action/*

路由到主页按预期工作。 但是字母和节目路线不能正常工作。 如果第一个路由字母然后它正常工作,并且路线显示不起作用。在这种情况下,我在解析URL“/ bmw-1-series-187-5-120-2004-2008”(/)后出现错误清空模块和/或操作。 如果我重新排列它们,那么字母指向一个动作视图,但它应该指向动作alphalist。

为什么他们互相覆盖?

已更新

这是一个在其他网站上有效的案例。

letters:
  url: /:letter
  param:
    module: define
    action: alphalist
    linkmode: "@letters"
    cachename: "letters"
    layer: "@default-layer"
  requirements:
    letter: "([A-Z]|0-9)"

disclaimer:
  url: /medical-disclaimer/
  param:
    module: define
    action: disclaimer

default-layer:
  url: /:search
  param:
    module: define
    action: word
    linkmode: "@default-layer"
    cachename: "default-layer"
  options:
    segment_separators: ['', '/']

1 个答案:

答案 0 :(得分:1)

他们互相覆盖,因为symfony尝试解决它的方式是相同的。

您为url: /:slug定义了show,这意味着网址将为/,之后会有/foo/toto。但您也为letters /:letter定义了此类网址,该网址也可以匹配/foo/toto

这就是为什么当您首先定义show路线时,show有效但letters无效。反之亦然。

您必须解决的方法是为每条路线定义唯一网址。类似的东西:

letters:
  url: /letters/:letter

show:
  url: /show/:slug

这样,由于前缀(字母和显示),每条路线都不会

修改

我明白了,即使两者都有/:slug,您的要求也可以帮助symfony匹配网址。

对于letter路由,您的要求只允许使用一个字母upercase。但对于show路由,它允许一个字母或一个数字。关于您的网址(bmw-1-series-187-5-120-2004-2008),这是错误的。

尝试使用此要求,show路线(您可以删除我之前提供的前缀):

  requirements:
   slug: "([a-z0-9\-]+)"