2009-12-18 83 views
0

我有一个Page对象,其唯一性来自其PageDomain。架构配置为使page表包含一个page_domain_id字段来创建关系。为了显示一个页面,我有一个executeShow动作和一个自定义处理程序。我的路线是这样的:将标准注入到sfPropelRoute对象中

page_show: 
    url:  /:domain_slug/:slug 
    class: sfPropelRoute 
    options: 
    model: Page 
    type: object 
    method_for_criteria: doSelectByDomain 
param: { module: page, action: show } 
requirements: 
    sf_method: [get] 

通过举例的方式,我可能有/audience/create/behavior/create。我需要能够确定哪个页面被请求。

自定义处理程序(doSelectByDomain)的目的是考虑domain_slug,并且只在其域名也正确的情况下检索/显示页面。但我发现,尽管参数在动作的$request参数中可用,但我无法将其获取到自定义处理程序,因此可以将其分解为检索的内容。

我意识到我可以直接从我的模型访问sfContext对象,但这样做最多不过分,并打破了MVC。如果没有更好的方法,我不害怕使用它,但似乎必须有。 Symfony为列表路由提供setListCriteria方法,但我找不到任何类似的对象路由。

帮助?谢谢。

回答

3

因此,通过源代码的一点冒险让我得到了我需要的地方。看起来sfPropelRoute提供了method_for_criteria选项,但考虑到sfObjectRoutemethod选项,并且如果它存在,则使用它。如果仅存在method_for_criteria,则sfPropelRoute类将根据请求参数创建一个标准对象。

除了它不包含任何不属于对象属性的参数。我知道这个行为有一个争论,但在我看来这是一个错误。

无论如何,简短版本是,如果您使用method选项,所有参数都会作为数组传递给指定的处理程序(无编辑)。如果您需要的参数不是那些属性的请求参数,这似乎是要走的路。

0

我不知道我完全理解你的问题(我读过这个是为了推进标签,而不是Symfony标签),但是来自Advent日历的Advanced Routing章有任何帮助吗?该代码是为教义,但我想你也可以适应Propel。