2010-02-05 36 views
9

Với Zend Framework, tôi đang cố gắng để xây dựng tuyến đường cho một API REST trên nguồn lực tổ chức trong các mô hình sau:Làm thế nào để thiết lập các tuyến đường phân cấp Zend Hierarchical?

Làm thế nào để thiết lập điều này với Zend_Rest_Route?

Dưới đây là cách tôi đã thiết lập các tuyến đường cho tài nguyên người dùng (người dùng /: id) trong file bootstrap.php tôi:

$this->bootstrap('frontController'); 
    $frontController = Zend_Controller_Front::getInstance(); 
    $restRoute = new Zend_Rest_Route($frontController); 
    $frontController->getRouter()->addRoute('default', $restRoute); 

[Theo như tôi hiểu, đây là một bắt tất cả các tuyến đường để người dùng/324/items/34 sẽ dẫn đến các tham số được đặt là id = 324 và items = 34 và mọi thứ sẽ được ánh xạ tới Mô hình Người dùng (mô-đun phía trước). Từ đó tôi đoán tôi chỉ có thể kiểm tra thông số mục và truy xuất mụC# 34 cho người dùng # 324 khi nhận yêu cầu.] < === Tôi vừa kiểm tra và dường như không hoạt động như sau:

Acessing/người dùng/234/mục/43 và

var_dump($this->_getAllParams()); 

trong hành động get của kết quả điều khiển phần còn lại trong đầu ra sau đây:

array(4) { 
["controller"]=> string(5) "users" 
["action"]=> string(3) "get" 
[2]=> string(5) "items" ["module"]=> string(7) "default"] 
} 

Bằng cách nào đó cả hai ids bị lạc ...

Bất cứ ai?

Trả lời

5

AFAIK, không có tính năng nào trong Zend_Rest_Route cho phép bạn làm điều gì đó như thế này. Có một đề xuất nhưng không chắc chắn khi nào nó sẽ được thực hiện. Bạn có thể thêm điều này trong Bootstrap của bạn để thiết lập tuyến tùy chỉnh này.

$front = $this->getResource('FrontController'); 
$testRoute = new Zend_Controller_Router_Route(
    'users/:user_id/items/:item_id', 
    array(
     'controller' => 'users', 
     'action' => 'item', 
     'module' => 'default' 
    ) 
); 

$front->getRouter()->addRoute('test', $testRoute); 

user_id hoặc item_id trở nên có sẵn trong itemAction trong UsersController như các thông số:

$user_id = $this->_request->getParam('user_id'); 
+1

Cám ơn câu trả lời của bạn. Bạn có quyền cuối cùng tôi đã phải từ bỏ Zend_Rest_Route như việc thực hiện hiện tại không hỗ trợ một chương trình như vậy. Cuối cùng tôi đã đi đến Zend_Controller_Router_Route với chuỗi: http://stackoverflow.com/questions/2250353/how-do-i-write-chains-of-chains-of-of-route-in-a-ini-file-for- the-zend-framew –

3

Zend_Rest_Route bản đồ tham số đầu tiên sau khi tên điều khiển để 'id' chỉ khi có 1 tham số.

Giải pháp tốt nhất mà tôi đã đưa ra là phân lớp Zend_Rest_Route và ghi đè hàm match(). Sao chép chức năng đối sánh của Zend_Rest_Route, nhưng thêm sau đây ngay trước bình luận "Digest URI Params" (khoảng 60 dòng).

if($pathElementCount > 1 && $path[0] != 'id') { 
    $params['id'] = urldecode($path[0]); 
    array_shift($path); 
} 

Điều đó sẽ cung cấp cho bạn chức năng mà bạn đang tìm kiếm.

+0

Tôi đã làm những gì bạn nói. Nhưng sau đó, làm thế nào để bạn sử dụng nó? Tôi đã mong đợi một cái gì đó như thế này trong routes.init routes.tasktypesstatus.map.1 = "type_id" của tôi nhưng nó không hoạt động:/ – Olivier

+0

Hy, bạn đã giải quyết chưa? Tôi cùng một vấn đề – user1066183

+0

Giải pháp này là hoàn hảo. Làm việc như một say mê. Chỉ cần tạo lớp của bạn để mở rộng Zend_Rest_Route. Nên bao gồm hàm tạo và hàm kết hợp. – a2ron44

6

Tôi mở nguồn giải pháp thành github và làm gói trình soạn. xem https://github.com/aporat/Application_Rest_Controller_Route.

Tôi đã thêm một lớp mới mà mở rộng Zend_Controller_Router_Route và thêm abiliy để thêm đường tùy chỉnh yên tĩnh, chẳng hạn như

$frontController = Zend_Controller_Front::getInstance(); 
$frontController->getRouter()->addRoute('users-messages', new Application_Rest_Controller_Route($frontController, 'users/:user_id/messages', ['controller' => 'users-messages'])); 
+0

Lớp học của bạn hoạt động rất tốt, cảm ơn bạn –

+0

Cảm ơn! Điều thú vị là, ban đầu tôi muốn sử dụng điều này cho URL của tôi 'người dùng /: user_id/messages', đó là URL chính xác trong ví dụ của bạn! –

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