【问题标题】:Confusion of slug with route part "new" etc蛞蝓与路线部分“新”等混淆
【发布时间】:2013-02-17 18:48:46
【问题描述】:

我有一个 sfDoctrineRouteCollection:

foo:
  class:  sfDoctrineRouteCollection
  options:
    model: Foo
    columns: slug
    action: [list, show, new, create, edit, update, delete]

如果现在有人创建了一个新实体,其 slug 导致,例如,“new”,路由引擎会混淆两条路由 /foo/new 用于创建新实体,/foo/new 用于显示带有 slug 的实体“new” ”。

什么是解决这个问题的简洁优雅的解决方案?

当然,我可以提供明确的路由定义,但这会使 sfDoctrineRouteCollection 有点过时。 “show”操作的单独路由定义已经解决了这个问题,例如,通过添加像“/foo/:slug/show”这样的前缀。我还可以提供一个自定义的 slugify 方法来拦截诸如“新”之类的 slug 等。

你知道任何干净优雅的解决方案吗?

【问题讨论】:

  • 使用如下所示的 prefix_path 或 segment_name 选项是否有帮助:symfonyreference.com/routing-yml
  • 好吧,如果你有一个带有蛞蝓 new 的项目并且你想查看它,它将转到 /foo/new/show/foo/new 不应该显示任何内容,因为它不会知道该怎么做.. action 参数不存在。否则,您应该避免将slug 变为new,或任何可能破坏路由的操作。
  • @j0k “动作”在这种情况下是隐含的。 Symfony 使用 request 方法来查找正确的操作。

标签: symfony-1.4 url-routing doctrine-1.2 slug


【解决方案1】:

您可以使用segment_names 选项将new 更改为其他内容,或者您​​可以使用更明确的内容,例如idid-slug 或禁用with_show 并添加一个节目object action

object_actions: { show: [get, head] }

【讨论】:

  • 感谢您的回答。 segment_names 不会这样做,因为相应的名称也可以用于创建新对象。禁用标准显示操作并定义附加对象操作与提供显式路由定义几乎相同(正如我在问题中提到的那样)。扩展蛞蝓也不能完全解决问题。当然,用匹配的 slug 也包含 id 创建一个新对象是有挑战性的。但这根本不是一个选项,因为这是使用 slug 的原因之一:从 URL 中删除 id。 (恕我直言)
  • 不过,感谢您的回答。我想我会定义一个明确的显示动作,比如/foo/:slug/show
猜你喜欢
  • 2014-05-17
  • 2018-02-27
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 2015-01-06
  • 2019-08-15
  • 2017-11-05
  • 2014-07-30
相关资源
最近更新 更多