Php 如何使用同名的不同模块创建路由?

Php 如何使用同名的不同模块创建路由?,php,symfony1,propel,Php,Symfony1,Propel,我有两种不同的型号:类别和页面。My schema.yml: propel: wiki_category: id: ~ address: { type: varchar(255) } name: { type: varchar(255), required: true } text: { type: longvarchar } wiki_page: id: ~

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

有没有办法做到这一点


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

由于您有两个同名字段,因此无法理解哪个字段(来自
/:address/:address
)是用于获取
WikiPage
对象的字段

第一个最简单的选项是重命名模式中的一个
地址
。类似于
wiki\u页面的
address\u页面
,因此您将能够拥有这样的路径
/:address/:address\u页面
,并且您将知道如何检索
WikiPage
对象

但我会向您推荐第二种选择。

不要使用class
sfPropelRoute
检索对象。改用
sfRequestRoute
。然后,您可以为参数指定您想要的名称。一些更明确的内容,如:
/:address\u category/:address\u 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();
为了让您知道SFPROPERROUTE的功能(基本上):

  • 尝试使用请求参数和路由配置检索对象
  • 如果找不到对象,则重定向到404
在您的情况下,您已经检索到了对象,如果它不存在,您现在只需要转发到404:

$this->forward404Unless($wikiPage);

类sfPropelRequest不存在。sfWebRequest?@briancheg您使用的是哪个版本的symfony&推进?symfony 1.4.20,symfony的推进默认值package@briancheg哦,我明白了,那是一个旧的推进包。你能更新到最新的吗?(与您的版本向后兼容)@briancheg如果我的答案对您有帮助,您可以向上投票和/或接受:)