2012-02-13 33 views
5

Tôi đang cố gắng tìm ra cách tốt nhất để thiết kế các url của mình là gì. Vì vậy, đây là những gì tôi đã làm cho đến nay:Symfony2 có xử lý url an toàn đúng cách và tôi có nên sử dụng url an toàn không?

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 } 

Sau khi thử nghiệm những gì tôi đã làm, tôi nhận ra rằng bản cập nhật và xóa không hoạt động (luôn luôn gọi account_read) ... Sau khi googling vấn đề của tôi, tôi phát hiện ra rằng phương pháp PUT và DELETE không được hỗ trợ trong tất cả các trình duyệt ... và có thể bị xóa trong tương lai.

Sau đó tôi đọc Ruby on rails hỗ trợ hai phương thức này trên tất cả các trình duyệt bằng cách thực hiện một số phép thuật.

Vì vậy, tôi tự hỏi, Symfony2 có thể xử lý PUT và DELETE như ruby ​​không? VÀ Tôi có nên sử dụng url yên tĩnh không?

Trả lời

12

Có, symfony2 dứt khoát là tuân thủ RESTful.

Tôi không biết đường ray, nhưng Symfony2 xử lý phát hiện phương thức HTTP sử dụng nhiều cách khác nhau:

  • đầu tiên nhận được REQUEST_METHOD từ php
  • sau đó nếu và phương pháp duy nhất == POST, được phương pháp từ X-HTTP-METHOD-OVERRIDE tiêu đề (dự phòng để _method request parameter)

Tại sao nó làm cho chek này trên POST là bởi vì trình duyệt không thể gửi không có gì khác nhưng GET hoặc POST yêu cầu.

Điều khác biệt với đường ray và/hoặc symfony1 là không có trình trợ giúp để tạo liên kết hoặc biểu mẫu với các phương thức tương ứng. Tùy thuộc vào bạn để tạo yêu cầu hợp lệ cho ứng dụng của bạn.

PS: Liên quan đến định tuyến của bạn, bạn nên viết yêu cầu của bạn trên _method trong UPPERCASE.

+0

bạn có một ý tưởng về lý do tại sao Symfony thực thi account_read thay vì account_delete ngay cả khi phương thức form của tôi là "DELETE"? –

+9

Trình duyệt của bạn sẽ không bao giờ gửi yêu cầu DELETE ngay cả khi html của bạn chứa '

'. Bạn có thể mô phỏng điều này bằng cách sử dụng '
' – Florian

3

Nếu bạn dự định triển khai các dịch vụ RESTful, bạn có thể xem RestBundle. Họ đã có các quy ước đặt tên url khá tốt, mà bạn có thể đồng ý với, và rất nhiều thứ khác sẽ đơn giản hóa quá trình phát triển.

Và có, Symfony2 có thể xử lý các yêu cầu PUT và DELETE.

1

Vấn đề là không phải những gì Symfony có thể làm hoặc không thể, điểm mấu chốt là như thế nào "Restful url" xử lý với các trình duyệt có sẵn hiện tại ...

Một số trình duyệt sẽ không cho phép bạn sử dụng một số phương pháp HTTP (như đặt hoặc xóa), do đó có, thực hiện tốt sẽ sử dụng GET, POST, PUT, DELETE và PATCH, nhưng bạn sẽ nhận được vấn đề với một số người dùng :)

Như mọi khi ... trình duyệt ...

Các vấn đề liên quan