2009-08-27 6 views
5

Avec l'introduction de Zend_Rest_Route dans Zend Framework 1.9 (et ses update dans 1.9.2), nous avons maintenant une solution RESTful standardisée pour les demandes de routage. En août 2009, il n'y a pas d'exemples d'utilisation, seulement la documentation de base trouvée dans le guide de référence.Zend Framework 1.9.2+ Zend_Rest_Route Exemples

Bien qu'il soit peut-être beaucoup plus simple que je suppose, j'espérais les plus compétents que je pourrais donner des exemples illustrant l'utilisation du Zend_Rest_Controller dans un scénario où:

  • Certains contrôleurs (tels que IndexController .php) fonctionnent normalement
  • d'autres fonctionnent comme services de repos (JSON retour)

Il semble que le JSON Action Helper automatise maintenant complètement et permet d'optimiser la réponse JSON à une demande, ce qui rend son utilisez avec Zend_Rest_Route une combinaison idéale.

Répondre

6

Apparaît que c'était plutôt simple. J'ai mis en place un modèle de contrôleur Restful en utilisant le résumé de Zend_Rest_Controller. Remplacez simplement les valeurs de retour no_results par un objet php natif contenant les données que vous souhaitez renvoyer. Commentaires bienvenus.

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

finit le correctif n'a pas fait en 1.9.2, vous devez transmettre un listAction à l'index (mis à jour ci-dessus). –

+0

Semble être prévu pour 1.9.3 (recherche de «reste» dans le texte de la page ici :) http://framework.zend.com/issues/browse/ZF/fixforversion/10360 –

0

grand poste, mais je l'aurais pensé la route Zend_Rest_Controller serait la requête à l'action à droite par rapport à la méthode HTTP utilisée. Ce serait bien si une demande POST à http://<app URL>/Restful serait automatiquement _forward à postAction par exemple.

Je vais aller de l'avant et fournir une autre stratégie ci-dessous, mais peut-être que je manque le point derrière Zend_Rest_Controller ... s'il vous plaît commenter.

Ma stratégie:

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

Salut à nouveau, ne cherche pas à marquer un répondre sur stackoverflow ici; 0) Je pensais que poster une réponse était la seule façon de commenter votre post ci-dessus. Rappelez-vous mon volet de code ci-dessus ressemble bitchin 'dans le format de réponse, 0) –

+0

Merci l'homme :) Est-ce drôle, après avoir mis en œuvre tout cela, nous avons fini par revenir à un modèle moins reposant. J'ai juste remarqué un article du chef de projet de Zend sur les meilleures pratiques, posté ici aussi pour d'autres. –

+1

'Zend_Rest_Controller' fait tout cela automatiquement. La pièce qui vous manque est [initialiser les routes REST] (http://framework.zend.com/manual/fr/zend.controller.router.html#zend.controller.router.routes.rest). – Andrew