0

我有 2 种不同的模型:类别和页面。我的 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 }

我的路由.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(来自页面)

有没有办法做到这一点?

这个想法是制作一个类别页面,其中包含指向该类别页面的链接。通过按链接执行页面的动作显示。

4

1 回答 1

0

由于您有两个具有相同名称的字段,因此 Propel 将无法理解其中一个(来自/:address/:address)是用于获取WikiPage对象的字段。

第一个最简单的选择是address在架构中重命名一个。喜欢address_pagefor wiki_page,所以你将能够拥有这样的路线/:address/:address_page,Propel 将知道如何检索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 }

然后,在动作内部,您必须手动检索对象:

$wikiPage = WikiPageQuery::create()
  ->filterByAddress($request->getParameter('address_page'))
  ->leftJoin('WikiPage.WikiCategory')
  ->where('WikiCategory.address = ?', $request->getParameter('address_category'))
  ->findOne();

只是为了让您知道 sfPropelRoute 的作用(基本上):

  • 尝试使用请求参数和路由配置检索对象
  • 如果找不到对象重定向到 404

在您的情况下,您已经检索到对象,如果它不存在,您现在只需转发到 404:

$this->forward404Unless($wikiPage);
于 2013-02-22T08:37:57.710 回答