【问题标题】:Does Symfony2 handle restful url properly and should I use restful url?Symfony2 是否正确处理了 restful url,我应该使用 restful url 吗?
【发布时间】:2012-02-13 01:58:49
【问题描述】:

我正在尝试找出设计网址的最佳方式。 所以这是我到目前为止所做的:

account_index:
    pattern:  /Accounts/
    defaults: { _controller: "CoreBundle:Account:index" }
    requirements: { _method: get }

account_create:
    pattern:  /Accounts/
    defaults: { _controller: "CoreBundle:Account:create" }
    requirements: { _method: post }

account_read:
    pattern:  /Accounts/{id}
    defaults: { _controller: "CoreBundle:Account:show" }
    requirements: { _method: get }

account_update:
    pattern:  /Accounts/{id}
    defaults: { _controller: "CoreBundle:Account:update" }
    requirements: { _method: put }

account_delete:
    pattern:  /Accounts/{id}
    defaults: { _controller: "CoreBundle:Account:delete" }
    requirements: { _method: delete }

在测试了我所做的之后,我意识到更新和删除不起作用(总是调用 account_read)... 在谷歌搜索我的问题后,我发现并非所有浏览器都支持 PUT 和 DELETE 方法。 .. 并且将来可能会被删除。

然后我读到 Ruby on rails 做了一些魔术,在所有浏览器上都支持这两种方法。

所以我想知道,Symfony2 能像 ruby​​ 一样处理 PUT 和 DELETE 吗? 和 我应该使用restful url吗?

【问题讨论】:

    标签: php symfony url restful-url http-delete


    【解决方案1】:

    是的,symfony2 绝对是 RESTful 兼容的。

    我不知道 Rails,但 Symfony2 使用不同的方式处理 HTTP 方法检测:

    • 首先从php获取REQUEST_METHOD
    • 如果且仅方法 == POST,则从 X-HTTP-METHOD-OVERRIDE 标头获取方法(回退到 _method 请求参数)

    为什么它在POST 上进行检查是因为浏览器只能发送 GET 或 POST 请求。

    与 rails 和/或 symfony1 的不同之处在于没有帮助程序来生成具有相应方法的链接或表单。您可以为您的应用程序生成有效请求。

    PS:关于你的路由,你应该把你的要求写在大写的_method上。

    【讨论】:

    • 你知道为什么 Symfony 执行 account_read 而不是 account_delete,即使我的表单方法是“DELETE”?
    • 即使您的 html 包含 <form method="DELETE">,您的浏览器也不会发送 DELETE 请求。您可以使用<form method="POST"> <input type="hidden" name="_method" value="DELETE" /> </form> 来模拟它
    【解决方案2】:

    如果您打算实现 RESTful 服务,可以查看 RestBundle。他们已经有了很好的 url 命名约定,你可能会同意,还有很多其他可以简化开发过程的东西。

    是的,Symfony2 可以处理 PUT 和 DELETE 请求。

    【讨论】:

      【解决方案3】:

      关键不是 Symfony 能做什么或不能做什么,关键是“Restful url”如何处理当前可用的浏览器......

      某些浏览器不允许您使用某些 HTTP 方法(例如 put 或 delete),所以是的,一个好的实现将使用 GET、POST、PUT、DELETE 和 PATCH,但您会遇到一些用户的问题 :)

      一如既往...浏览器...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-02
        • 1970-01-01
        • 1970-01-01
        • 2011-11-16
        • 2018-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多