我在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: ['', '/']
答案 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\-]+)"