2011-12-13 39 views
5

Tôi đang mong đợi để nhận được của uri nhưTôi có thể sử dụng Catalyst và chuỗi uri bằng giao diện REST như thế nào?

/user/*/account/* 

Tôi đã có một hàm do người dùng định nghĩa là

sub user :Path('/user') :PathPart('') :ActionClass('REST') {} 

sau đó

sub user_GET :PathPart('user') Chained('/') CaptureArgs(1) { 
    #do stuff 

} 

Đối với tài khoản tôi định nghĩa chúng tương tự.

sub account :Path('/account') :PathPart('') :ActionClass('REST') {} 

sub account_GET :PathPart('account') Chained('user_GET') Args(1) { 
    #do stuff 
} 

Vì vậy, vấn đề là khi tôi thiết lập Chained trong account_GET để 'user_GET' máy chủ debug cho thấy con đường được thiết lập:

[debug] Loaded Chained actions: 
.-----------------------------+--------------------------------------. 
| Path Spec     | Private        | 
+-----------------------------+--------------------------------------+ 
| /user/*/account/*   | /mcp/user_GET (1)     | 
|        | => /mcp/account_GET     | 
'-----------------------------+--------------------------------------' 

Khi tôi đặt Chained trong account_GET để 'dùng' gỡ lỗi máy chủ cho thấy:

[debug] Unattached Chained actions: 

[debug] Unattached Chained actions: 

.-------------------------------------+--------------------------------------. 
| Private        | Missing parent      | 
+-------------------------------------+--------------------------------------+ 
| /mcp/account_GET     | /mcp/user       | 
'-------------------------------------+--------------------------------------' 

vấn đề là rõ ràng sau đó không được thành lập và cựu là trở về rằng nó đã không được tìm thấy.

Vì vậy, vấn đề là nếu tôi gọi/người dùng/12345/tài khoản/23456 làm cách nào để nhận được đường dẫn đó đặt chính xác khi nào dường như là đường dẫn rõ ràng, Chained ('user'), không phải là được thiết lập và con đường ít rõ ràng hơn, Chained ('user_GET'), đơn giản là không hoạt động?

+0

Bạn đã bao giờ tìm ra điều này chưa? – simbabque

Trả lời

3

mst từ #catalyst nói:

các _GET/phương pháp _POST không cần công văn thuộc tính

+0

thật tuyệt, nhưng sau đó bạn làm như thế nào '/ user/*/account/*' – xenoterracide

+1

Điều này có hiệu quả. Chỉ cần thiết lập người dùng phụ: Đường dẫn ('/ người dùng'): PathPart (''): ActionClass ('REST') {} và sau đó có sub user_GET {} và điều tương tự cho tài khoản phụ là những gì tôi đang tìm kiếm. Cám ơn phản hồi của bạn. – jmcneirney

+0

Xin lỗi, điều này không hoạt động. Những gì nó đã làm là ngăn chặn mọi thứ phá vỡ và tôi nhầm tưởng rằng nó hoạt động. Vì vậy, vấn đề mà xenoterracide giải quyết trong bình luận trên vẫn còn là một vấn đề: "/ user/*/account/*" – jmcneirney

1

Tôi tin rằng làm một cái gì đó như sau sẽ làm việc, tuy nhiên bạn sẽ phải vượt qua đối số xích bằng cách nào đó, hoặc trong stash, hoặc có thể là một thuộc tính đối tượng trong $ tự.

sub base 
    :Chained('/') 
    :PathPart('') 
    :CaptureArgs(0) 
    { 
    my ($self, $c) = @_; 
} 

sub user_account 
    :Chained('/') 
    :PathPart('user') 
    :CaptureArgs(1) 
    :ActionClass('REST') 
    { 
    my ($self, $c, $user_id) = @_; 
} 

sub user_account_GET 
    :Chained('user') 
    :PathPart('account') 
    :Args(1) 
    { 
    my ($self, $c) = @_; 
} 

Đây là con đường spec nó tạo

[debug] Loaded Chained actions: 
.-------------------------------------+--------------------------------------. 
| Path Spec       | Private        | 
+-------------------------------------+--------------------------------------+ 
| /user/*/account/*     | /user/base (0)      | 
|          | -> /user/user_account (1)   | 
|          | => /user/user_account_GET   | 

:Chained('/') tất nhiên có nghĩa là beggining của một chuỗi. :Chained('user_account') về cơ bản có nghĩa là tìm một chương trình con trong bộ điều khiển này có tên user_account nếu bạn đặt :Chained('/user_account') nó sẽ bắt đầu tìm trong bộ điều khiển gốc (điều này phức tạp hơn một chút khi bạn có thể tạo chuỗi toàn cầu bên ngoài bộ điều khiển gốc). :PathPart('foo') xác định thành phần của URI thực tế. Rõ ràng bạn cần sử dụng :CaptureArgs(1) trên một điểm giữa và :Args(1) ở điểm cuối.

4

Cá nhân, tôi muốn đi cho một cái gì đó như sau trong bộ điều khiển sử dụng:

package MyApp::Controller::User; 
... 
# root of the chain 
sub object: Chained PathPart('user') CaptureArgs(1) { ... } 

Hành động object trên sẽ tải các đối tượng người dùng vào stash.Bây giờ tôi muốn có bộ điều khiển sử dụng xích tắt ở trên như sau:

package MyApp::Controller::User::Account; 
... 
# chains to the action loading the user object and dispatches RESTy 
sub account: Chained('/user/object') ActionClass('REST') Args(1) { ... } 

# handle individual request methods 
sub account_GET { ... } 
sub account_POST { ... } 

Đây là hành động account cung cấp dữ liệu chung cho account_* phương pháp, trong đó thực hiện các hoạt động thực tế.

Có các hành động cụ thể của phương pháp như các phần của chuỗi (như có user phản ứng với yêu cầu POST đối với hành động account) có vẻ phản trực giác từ quan điểm thiết kế. Điều đó có thể hiệu quả, nhưng tôi chưa bao giờ thử nó.

Các ví dụ trên tất nhiên là đơn giản. Tôi thường có một hành động base trong mỗi bộ điều khiển thiết lập không gian tên và một hành động cha mẹ phổ biến, và tất cả các hành động khác trong bộ điều khiển sẽ chặn chuỗi đó. Sau đó, tôi sẽ có một số object như trên để tải tài nguyên đơn lẻ và root cho tác vụ gốc của bộ điều khiển. Vì bạn có thể xây dựng bất kỳ loại cấu trúc cây nào, nó khá linh hoạt. Vì vậy, giải pháp tốt nhất thường phụ thuộc vào những hạn chế của bạn là gì.

+0

Điều này có vẻ khó xử vì việc tạo tài khoản sẽ được thực hiện với POST tới '/ user/object/account' sẽ là một sơ khai (tài khoản không nên chấp nhận ': Args (1)' .. Tôi chỉ nói điều này sẽ hiệu quả, nhưng đây không phải là quy ước REST truyền thống như [được định nghĩa bởi chất xúc tác] (http: //www.catalystframework .org/calendar/2006/9) và [xương sống] (http://addyosmani.github.io/backbone-fundamentals/#creating-the-back-end) –

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