如何创建具有相同名称的不同模块的路由?

时间:2013-02-22 06:59:01

标签: php symfony1 propel

我有两种不同的型号:类别和页面。我的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(来自页面)

有没有办法做到这一点?

我们的想法是创建一个类别页面,其中包含指向此类别页面的链接。通过按链接执行页面的动作显示。

1 个答案:

答案 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

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

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