2009-08-27 13 views
5

Con la introducción de Zend_Rest_Route en Zend Framework 1.9 (y su update en 1.9.2) ahora tenemos una solución RESTful estandarizada para las solicitudes de enrutamiento. A partir de agosto de 2009, no hay ejemplos de su uso, solo la documentación básica que se encuentra en la guía de referencia.Zend Framework 1.9.2+ Zend_Rest_Route Ejemplos

Si bien es quizás mucho más sencillo de lo que supongo, esperaba los más competentes que yo podría dar algunos ejemplos que ilustran el uso de la Zend_Rest_Controller en un escenario en el que:

  • Algunos controladores (como IndexController .php) funciona normalmente
  • otros operan como servicios basados ​​en descanso (JSON regresar)

aparece el JSON Action Helper ahora automatiza completamente y optimiza la respuesta JSON a una solicitud, haciendo su usar junto con Zend_Rest_Route una combinación ideal.

Respuesta

6

Parece que fue bastante simple. He creado una plantilla de controlador relajante con Zend_Rest_Controller Abstract. Simplemente reemplace los valores de retorno no_results con un objeto php nativo que contenga los datos que desea devolver. Comentarios bienvenidos.

<?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

termina el arreglo no lo hacen en 1.9.2, es necesario reenviar un accionlista al índice (actualizado arriba). –

+0

Parece estar programado para 1.9.3 (busque 'reposo' en el texto de la página aquí :) http://framework.zend.com/issues/browse/ZF/fixforversion/10360 –

0

gran post, pero yo habría pensado que el Zend_Rest_Controller encaminaría la solicitud a la acción correcta en relación con el método HTTP utilizado. Sería bueno si una solicitud POST a http://<app URL>/Restful automáticamente _forward a postAction por ejemplo.

Voy a seguir adelante y proporcionar otra estrategia a continuación, pero tal vez me falta el punto detrás de Zend_Rest_Controller ... por favor comente.

Mi estrategia:

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

Hola de nuevo, no estoy buscando una puntuación responde en stackoverflow aquí; 0) Pensé que publicar una respuesta era la única forma de comentar tu publicación anterior. Tenga en cuenta que mi panel de códigos de arriba parece bitchin 'en el formato de respuesta; 0) –

+0

Gracias hombre :) Es gracioso, después de implementar todo esto terminamos volviendo a un modelo menos descansado. Acabo de notar una publicación del plomo del proyecto de Zend sobre las mejores prácticas, publicada aquí también para otros. –

+1

'Zend_Rest_Controller' hace todo esto automáticamente. La parte que falta es [inicializando las rutas REST] (http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.rest). – Andrew