【问题标题】:How to create route with different modules with same name?如何创建具有相同名称的不同模块的路由?
【发布时间】:2013-02-22 06:59:01
【问题描述】:

我有 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(from category)/:address(from page)的路线

有什么办法吗?

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

【问题讨论】:

    标签: php symfony1 propel


    【解决方案1】:

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

    第一个最简单选项是在你的架构中重命名一个address。就像address_page for 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);
    

    【讨论】:

    • 类 sfPropelRequest 不存在。 sfWebRequest?
    • @briancheg 你用的是哪个版本的 symfony & propel?
    • symfony 1.4.20 ,从 symfony 包中推进默认值
    • @briancheg 哦,我明白了,那是一个旧的 Propel 包。你能更新到最新的吗? (与您的版本向后兼容)github.com/propelorm/sfPropelORMPlugin
    • @briancheg 如果我的回答对您有帮助,您可以投票和/或接受它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 2020-02-18
    • 2017-05-27
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    相关资源
    最近更新 更多