2009-08-27 27 views
5

Với việc giới thiệu Zend_Rest_Route trong Zend Framework 1.9 (và update trong 1.9.2), chúng tôi hiện có giải pháp RESTful chuẩn hóa cho các yêu cầu định tuyến. Tính đến tháng 8 năm 2009, không có ví dụ về cách sử dụng của nó, chỉ có tài liệu cơ bản được tìm thấy trong hướng dẫn tham khảo.Zend Framework 1.9.2+ Zend_Rest_Route Ví dụ

Trong khi đó có lẽ xa hơn đơn giản hơn tôi giả định, tôi đã hy vọng những thẩm quyền nhiều hơn tôi có thể cung cấp một số ví dụ minh họa việc sử dụng các Zend_Rest_Controller trong một kịch bản mà:

  • Một số bộ điều khiển (như indexController .php) hoạt động bình thường
  • khác hoạt động như các dịch vụ còn lại dựa trên (trở về json)

dường như JSON Action Helper nay tự động hóa hoàn toàn và tối ưu hóa các phản ứng json một yêu cầu, làm cho nó sử dụng cùng với Zend_Rest_Route một sự kết hợp lý tưởng.

Trả lời

6

Xuất hiện nó khá đơn giản. Tôi đã đặt cùng một mẫu Controller Restful bằng cách sử dụng Abstract Zend_Rest_Controller. Chỉ cần thay thế giá trị trả về no_results bằng một đối tượng php gốc chứa dữ liệu bạn muốn trả về. Bình luận chào mừng.

<?php 
/** 
* Restful Controller 
* 
* @copyright Copyright (c) 2009 ? (http://www.?.com) 
*/ 
class RestfulController extends Zend_Rest_Controller 
{ 

    public function init() 
    { 
     $config = Zend_Registry::get('config'); 
     $this->db = Zend_Db::factory($config->resources->db); 
     $this->no_results = array('status' => 'NO_RESULTS'); 
    } 

    /** 
    * List 
    * 
    * The index action handles index/list requests; it responds with a 
    * list of the requested resources. 
    * 
    * @return json 
    */ 
    public function indexAction() 
    { 
     // do some processing... 
     // Send the JSON response: 
     $this->_helper->json($this->no_results); 
    } 
    // 1.9.2 fix 
    public function listAction() { return $this->_forward('index'); } 

    /** 
    * View 
    * 
    * The get action handles GET requests and receives an 'id' parameter; it 
    * responds with the server resource state of the resource identified 
    * by the 'id' value. 
    * 
    * @param integer $id 
    * @return json 
    */ 
    public function getAction() 
    { 
     $id = $this->_getParam('id', 0); 

     // do some processing... 
     // Send the JSON response: 
     $this->_helper->json($this->no_results); 
    } 

    /** 
    * Create 
    * 
    * The post action handles POST requests; it accepts and digests a 
    * POSTed resource representation and persists the resource state. 
    * 
    * @param integer $id 
    * @return json 
    */ 
    public function postAction() 
    { 
     $id = $this->_getParam('id', 0); 
     $my = $this->_getAllParams(); 

     // do some processing... 
     // Send the JSON response: 
     $this->_helper->json($this->no_results); 
    } 

    /** 
    * Update 
    * 
    * The put action handles PUT requests and receives an 'id' parameter; it 
    * updates the server resource state of the resource identified by 
    * the 'id' value. 
    * 
    * @param integer $id 
    * @return json 
    */ 
    public function putAction() 
    { 
     $id = $this->_getParam('id', 0); 
     $my = $this->_getAllParams(); 

     // do some processing... 
     // Send the JSON response: 
     $this->_helper->json($this->no_results); 
    } 

    /** 
    * Delete 
    * 
    * The delete action handles DELETE requests and receives an 'id' 
    * parameter; it updates the server resource state of the resource 
    * identified by the 'id' value. 
    * 
    * @param integer $id 
    * @return json 
    */ 
    public function deleteAction() 
    { 
     $id = $this->_getParam('id', 0); 

     // do some processing... 
     // Send the JSON response: 
     $this->_helper->json($this->no_results); 
    } 
} 
+0

Kết thúc lên việc sửa chữa không làm cho nó trong 1.9.2, bạn cần phải chuyển tiếp một listAction chỉ mục (cập nhật ở trên). –

+0

Xuất hiện để được dự kiến ​​cho 1.9.3 (tìm kiếm 'phần còn lại' trong văn bản trang tại đây :) http://framework.zend.com/issues/browse/ZF/fixforversion/10360 –

0

bài đăng tuyệt vời, nhưng tôi đã nghĩ rằng Zend_Rest_Controller sẽ định tuyến yêu cầu đến đúng hành động đối với phương pháp HTTP được sử dụng. Nó sẽ gọn gàng nếu yêu cầu POST đến http://<app URL>/Restful sẽ tự động _forward thành postAction chẳng hạn.

Tôi sẽ tiếp tục và cung cấp một chiến lược khác bên dưới, nhưng có thể tôi thiếu điểm sau Zend_Rest_Controller ... vui lòng nhận xét.

Chiến lược của tôi:

class RestfulController extends Zend_Rest_Controller 
{ 

    public function init() 
    { 
    $this->_helper->viewRenderer->setNoRender(); 
    $this->_helper->layout->disableLayout(); 
    } 

    public function indexAction() 
    { 
     if($this->getRequest()->getMethod() === 'POST') 
      {return $this->_forward('post');} 

     if($this->getRequest()->getMethod() === 'GET') 
      {return $this->_forward('get');} 

     if($this->getRequest()->getMethod() === 'PUT') 
      {return $this->_forward('put');} 

     if($this->getRequest()->getMethod() === 'DELETE') 
      {return $this->_forward('delete');} 

     $this->_helper->json($listMyCustomObjects); 

    } 
    // 1.9.2 fix 
    public function listAction() { return $this->_forward('index'); } 

[the rest of the code with action functions] 
+0

Xin chào một lần nữa, không tìm kiếm điểm số câu trả lời trên stackoverflow ở đây; 0) Tôi nghĩ rằng gửi một câu trả lời là cách duy nhất để bình luận về bài viết của bạn ở trên. Tâm trí bạn cửa sổ mã của tôi ở trên trông bitchin 'trong các định dạng câu trả lời; 0) –

+0

Cảm ơn người đàn ông :) Là buồn cười, sau khi thực hiện tất cả điều này, chúng tôi đã kết thúc trở lại một mô hình ít yên tĩnh. Chỉ cần nhận thấy một bài viết từ Zend của dự án dẫn trên thực hành tốt nhất, được đăng ở đây cũng như cho những người khác. –

+1

'Zend_Rest_Controller' thực hiện tất cả điều này một cách tự động. Phần bạn đang thiếu là [khởi tạo các tuyến REST] (http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.rest). – Andrew