【问题标题】:Symfony2: simplest way to get RESTful urlsSymfony2:获取 RESTful url 的最简单方法
【发布时间】:2012-01-12 21:47:54
【问题描述】:

目前我有通常的控制器/动作结构:

博客控制器:

/blog/list  
/blog/create  
/blog/detail/my-blog-hash

和 PostController

/post/create  
/post/detail/my-post-hash

我想要的是博客文章详细视图的 URL:

/blog/detail/my-blog-hash/post/my-post-hash

我知道有一个 RESTBundle,但这使 IMO 的事情变得过于复杂,并且路由和表单验证存在一些我无法解决的实际问题(即使在 IRC 人员的帮助下)。 我不需要 JSON、序列化程序、特殊视图等的访问点,我只需要一种以某种方式堆叠控制器的方法。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你的问题没有逻辑意义。您不能让两个控制器处理请求然后返回响应。您可以将其传递给BlogController,然后再将其转发给PostController,但您最好使用一个控制器并让它负责执行的任何操作.
  • @Jaitsu 我不要求一种方法来处理多个控制器的一个请求。我不在乎路由是如何工作的。我想要的是一个 RESTful url 结构和一种构造控制器的方法,以便博客内容可以由 BlogController 处理,而帖子内容可以从 PostController 处理
  • 我误解了原来的问题。那么只定义两条单独的路由有什么问题呢?
  • @Jaitsu 实际上没有真正的问题。但是手动处理有一些开销:您必须在每个子控制器操作中检索父对象(博客),并查看帖子是否是它的有效子对象。然后考虑更深层次的层次结构——会有相当多的开销:视图和操作中的参数、检索对象、验证关系——这些都是应该由/某个框架 IMO 处理的事情。但有时最好坚持务实的方式——谢谢你提醒我!你可以写一些说明性的线条,我会给你赏金:)

标签: rest routing symfony


【解决方案1】:

这并不能回答您的具体问题,但我想推荐一种更简洁、更 RESTful 的 URL 设计。

要使用博客,请与/blogs 基本资源进行交互。

POST /blogs 创建博客。

GET /blogs 列出所有博客。

要使用特定博客,您需要指定哪个博客。

GET /blogs/:id 获取特定博客的详细信息。

现在具体说明您要与博客的哪个子资源进行交互。

POST /blogs/:id/posts 创建一个新帖子。

GET /blogs/:id/posts/:id 获取特定博客的特定帖子的详细信息。

【讨论】:

    【解决方案2】:

    以 REST 的方式思考,您有两种资源:博客和帖子。

    在 RESTful 路由中,动作由 http 动词隐含。我知道您不在 Rails 中,但这些简单的表格说明了执行 REST 和 RESTful 嵌套资源的“Rails 方式”:

    http://edgeguides.rubyonrails.org/routing.html#crud-verbs-and-actions

    http://edgeguides.rubyonrails.org/routing.html#nested-resources

    很干净。

    【讨论】:

      【解决方案3】:

      你能不能只将带有两个参数的路由映射到详细操作?

      我们正在为我们的路线使用注释,这就是我所知道的 :) 但我想它的要点对于所有方法都是相同的。

      /**
       * @Route("/blog/{blog_hash}/post/{post_hash}", name="post_detail")
       */
      

      那么“问题”是您必须获取帖子的博客,以便在显示指向它的链接时将两个参数传递给 URL 助手,而不仅仅是帖子本身。不过我觉得没有别的办法了。

      详细操作必须检查给定的 url 是否有效。我怀疑 sf2 会为你做到这一点。

      【讨论】:

      • 这确实是可能的。问题是您在一个控制器中拥有整个代码。我希望 PostController 处理帖子内容,而 BlogController 处理博客内容。
      • 非常正确。我很想知道如何自己干净地做到这一点!
      【解决方案4】:

      我安装了RestBundle,玩了几个小时后我又把它删除了,由于路线不灵活(至少我没有找到如何相应地设置路线)。

      之后,我像在普通控制器中一样设置路由。所以我添加了这样的路由注释:

      // BlogController
      @ORM\Route("blogs/{blogHash}", name="blog_detail")
      public function detailAction(Blog $blog)
      

      还有:

      // PostController
      @ORM\Route("blogs/{blogHash}/post/{postHash}", name="blog_post_detail")
      public function detailAction($blogHash, $postHash)
      

      重要提示:您必须在路由配置中将 PostController 包含在 BlogController 之前

      【讨论】:

      • @maiwald:是的,我知道,没什么特别的。我希望有一个更“优雅”的解决方案。但是,我添加这几行只是为了完整性。
      猜你喜欢
      • 2022-01-26
      • 1970-01-01
      • 2015-05-21
      • 2022-09-30
      • 1970-01-01
      • 2019-01-25
      • 2012-05-16
      • 1970-01-01
      • 2018-07-09
      相关资源
      最近更新 更多