我有两种不同的型号:类别和页面。我的schema.yml:
propel:
wiki_category:
id: ~
address: { type: varchar(255) }
name: { type: varchar(255), required: true }
text: { type: longvarchar }
wiki_page:
id: ~
category_id: { type: integer, foreignTable: wiki_category, foreignReference: id, required: true}
address: { type: varchar(255) }
name: { type: varchar(255), required: true }
text: { type: longvarchar, required: true }
我的routing.yml:
category_show:
url: /:address.:sf_format
class: sfPropelRoute
options: { model: WikiCategory, type: object }
param: { module: category, action: show, sf_format: html }
requirements: { sf_method: get }
homepage:
url: /
param: { module: category, action: index }
page_show:
url: /:address/:address
class: sfPropelRoute
options: { model: WikiPage, type: object }
param: { module: page, action: show, sf_format: html }
requirements: { sf_method: get }
我想制作类似/:address
的路线(来自类别)/:address
(来自页面)
有没有办法做到这一点?
我们的想法是创建一个类别页面,其中包含指向此类别页面的链接。通过按链接执行页面的动作显示。
答案 0 :(得分:0)
由于您有两个具有相同名称的字段,因此Propel将无法理解其中一个(来自/:address/:address
)是用于获取WikiPage
对象的字段。
第一个最简单的选项是重命名架构中的一个address
。与address_page
的{{1}}一样,您可以拥有这样的路线wiki_page
,而Propel将知道如何检索/:address/:address_page
对象
但我会推荐你第二个选项。
不要使用类WikiPage
来检索您的对象。请改用sfPropelRoute
。然后,您可以为参数提供您想要的名称。比较明确的更像:sfRequestRoute
:
/:address_category/:address_page
然后,在操作中,您必须手动检索对象:
page_show:
url: /:address_category/:address_page
class: sfRequestRoute
param: { module: page, action: show, sf_format: html }
requirements: { sf_method: get }
只是为了让你知道sfPropelRoute的作用(基本上):
在您的情况下,您已经检索了对象,如果它不存在,您现在只需转发到404:
$wikiPage = WikiPageQuery::create()
->filterByAddress($request->getParameter('address_page'))
->leftJoin('WikiPage.WikiCategory')
->where('WikiCategory.address = ?', $request->getParameter('address_category'))
->findOne();