2012-01-12 35 views
6

Hiện nay tôi có bình thường cấu trúc điều khiển/Hành động:Symfony2: Cách đơn giản nhất để có được url RESTful

BlogController:

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

Và PostController

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

Những gì tôi muốn có một URL cho chế độ xem chi tiết bài đăng trên blog:

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

Tôi biết có một RESTBundle, nhưng điều này là quá phức tạp IMO và có một số vấn đề thực sự với các tuyến đường và xác nhận mẫu mà tôi không thể giải quyết (ngay cả với sự giúp đỡ của những kẻ trên IRC). Tôi không cần accesspoints cho JSON, serializers, xem đặc biệt, vv, tôi chỉ cần một cách để ngăn xếp bộ điều khiển bằng cách nào đó.

Ai đó có thể giúp tôi với điều này không?

+0

gì bạn đang yêu cầu làm cho không có logic giác quan. Bạn không thể có hai bộ điều khiển xử lý một yêu cầu và sau đó trả về một phản hồi. Bạn ** có thể ** chuyển nó vào 'BlogController' và sau đó chuyển tiếp nó vào' PostController' sau đó, nhưng bạn sẽ tốt hơn nhiều bằng cách sử dụng một bộ điều khiển và làm cho nó chịu trách nhiệm cho bất cứ hành động nào được thực hiện. – JamesHalsall

+0

@Jaitsu Tôi không yêu cầu một cách để xử lý một yêu cầu với nhiều bộ điều khiển. Tôi không quan tâm cách định tuyến hoạt động. Những gì tôi muốn là một cấu trúc url RESTful và một cách để cấu trúc bộ điều khiển để các công cụ blog có thể được xử lý bởi BlogController và bài công cụ có thể được xử lý từ PostController – stoefln

+0

Tôi hiểu lầm câu hỏi ban đầu. Vấn đề với việc xác định hai tuyến đường riêng biệt là gì? – JamesHalsall

Trả lời

0

Tôi đã cài đặt RestBundle, sau khi chơi khoảng vài giờ tôi đã xóa nó một lần nữa, do tính không linh hoạt của các tuyến (ít nhất tôi không tìm ra cách thiết lập các tuyến tương ứng).

Sau đó tôi đặt các tuyến giống như trong các bộ điều khiển chung. Vì vậy, tôi đã thêm chú thích định tuyến như thế:

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

Và:

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

Chú ý: bạn phải bao gồm các PostController trước BlogController trong cấu hình định tuyến của bạn

+0

trông quen thuộc… – maiwald

+0

@maiwald: vâng, tôi biết, không có gì đặc biệt. Tôi đã hy vọng cho một giải pháp "thanh lịch" hơn. Tuy nhiên, tôi đã thêm vào một vài dòng chỉ cho các vấn đề hoàn chỉnh. – stoefln

8

Điều này không trả lời cho câu hỏi cụ thể của bạn nhưng tôi muốn đề xuất thiết kế URL gọn hơn hơn RESTful.

Để làm việc với các blog nói chung tương tác với tài nguyên cơ sở /blogs.

POST /blogs để tạo blog.

GET /blogs để liệt kê tất cả các blog.

Để làm việc với một blog cụ thể, bạn sau đó chỉ định blog nào.

GET /blogs/:id để nhận chi tiết cho blog cụ thể.

Bây giờ, cụ thể là nguồn cấp dữ liệu phụ của blog bạn muốn tương tác.

POST /blogs/:id/posts để tạo bài đăng mới.

GET /blogs/:id/posts/:id để biết chi tiết về bài đăng cụ thể cho một blog cụ thể.

+0

Cảm ơn bạn, điều này có ý nghĩa – stoefln

0

Bạn có thể không chỉ ánh xạ tuyến đường với hai tham số cho hành động chi tiết không?

Chúng tôi đang sử dụng chú thích cho các tuyến đường của mình để làm những gì tôi biết :) Nhưng tôi cho rằng ý chính của nó giống nhau đối với tất cả các phương pháp.

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

Những 'vấn đề' sau đó là bạn phải lấy blog của bài để vượt qua hai đối số cho các helper URL khi hiển thị liên kết đến nó và không chỉ là bài riêng của mình. Nhưng tôi không nghĩ có cách nào khác.

Hành động chi tiết phải kiểm tra sau đó url đã cho hợp lệ. Tôi nghi ngờ rằng sf2 sẽ làm điều đó cho bạn.

+1

Điều này thực sự là có thể. vấn đề là bạn có toàn bộ mã trong một bộ điều khiển. Tôi muốn PostController xử lý các công cụ đăng bài và BlogController để làm các công cụ blog. – stoefln

+0

rất đúng. và tôi rất muốn biết làm thế nào để làm điều đó một cách sạch sẽ! – maiwald

1

Suy nghĩ một cách yên tĩnh, bạn có hai tài nguyên: blog và bài đăng.

Trong một tuyến đường RESTful, hành động được ngụ ý bởi động từ http.Tôi hiểu bạn đang không ở trong Rails, nhưng các bảng đơn giản minh hoạ "Rails cách" làm REST và RESTful nguồn lực lồng nhau:

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

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

Rất sạch.

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