Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 28-06-2007 10:37:48

numberxiii
Nouveau membre
Date d'inscription: 28-06-2007
Messages: 1

[Zend_Rest_Server][1.0.RC2] REST : respect des specs ?

Bonjour

Je découvre la partie Web Services du Zend Framework dans le cadre d'un projet de création d'API avec des Web Services REST.
Il y a déjà une application existante qui est basée sur le framework Zend, et il s'agit juste d'ajouter un nouveau mode d'accès. Donc, pour profiter de ce qui a déjà été développé, on continue avec le Zend Fwk.

Je suis malheureusement un peu "déçu" par un manque du Zend_Rest_Server.
Si vous lisez attentivement les spécifs de REST, vous remarquerez que normalement, vous avez des URI qui représentent des "ressources" (ex : /object/object_id) et pour effectuer les opérations CRUD, vous utilisez les différents types de requètes HTTP (GET, POST, PUT et DELETE).
Malheureusement, je pensais que le Zend_Rest_Server pouvait étendre le framework pour respecter cette spécif, mais en fait, si on veut garder un aspect MVC à l'appli en utilisant Zend_Controller, il faut passer par des URI du type /object/add pour un ajout, /object/update/object_id pour une mise à jour, etc...

On peut bidouiller la méthode indexAction du contrôleur en récupérant le type de requête HTTP pour lancer différentes actions selon que ce soit un GET, PUT, ... Mais du coup, on se retrouve avec une unique méthode qui mélange toutes les actions.

Peut-être faut-il arriver à configurer le Zend_Router_Rewrite pour qu'il route en fonction des requêtes HTTP ? Je ne sais pas si c'est possible.

Sur le net, 2 exemples de webservices Rest avec Zend ont la même architecture (http://blog.astrumfutura.com/archives/2 … ework.html et http://raphaelstolt.blogspot.com/2007/0 … -json.html).

Qu'est-ce que vous en pensez ?
Est-ce que quelqu'un a essayé de faire des Web Services REST avec Zend Fwk ?

++

Hors ligne

 

#2 21-08-2007 10:23:53

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Zend_Rest_Server][1.0.RC2] REST : respect des specs ?

il y a peut être une voie à creuser pour toi.

Code:

      $controller = self::getInstance($engine);
      $controller->throwExceptions(true);
      $controller->setControllerDirectory($controllerDirectory);
      $controller->setRequest('My_Controller_Request_Http');
      Zend_Loader::loadClass('My_Controller_Dispatcher');
      $dispatcher = new My_Controller_Dispatcher($dispatcher);
      $controller->setDispatcher($dispatcher);
      $controller->setBaseUrl($baseUrl);
      $controller->dispatch();

voilà à quoi ressemble mon code pour démarrer le controller
Je fournis ma propre classe Request qui dérive de Zend_Controller_Request_Http et surtout je pense pour toi
ma classe Dispatcher qui dérive de Zend_Controller_Dispatcher_Standard.

c'est cette dernière qui est en charge d'invoquer le controller.

Code:

public function dispatch(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response)

tu peux en surchargeant cette méthode implémenter ton propre modèle de dispatching. et donc tenir compte du Verbe Http utilisé.

c'est vrai que c'est dommage que Zend ne propose rien pour répondre à ce pb.
J'ai se genre de chose avec une implémentation pure php de DAV avec encore plus de verbes. en passant à Zned je pensais trouver de quoi porter ce truc mais non. il me faudra travailler car je pensais en plus de Dav proposer aussi de quoi fair du CalDav et autres dérivés.

A+JYT

Dernière modification par sekaijin (23-08-2007 10:41:18)

Hors ligne

 

#3 23-08-2007 10:40:50

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Zend_Rest_Server][1.0.RC2] REST : respect des specs ?

salut j'ai regardé la chose d'un peu plus pret pour voir si on pouvais facilement invoquer une action différente en fonction du mode et voilà à qui je suis arrivé

écrire une classe Dispatcher qui dérive de Zend_Controller_Dispatcher_Standard

recopier la méthode dispatch de Zend_Controller_Dispatcher_Standard pour la surcharger
chercher les lignes :

Code:

        /**
         * Retrieve the action name
         */
        $action = $this->getActionMethod($request);

et les remplacer par

Code:

        /**
         * Retrieve the action name
         */
        $action = $this->getActionMethod($request);
        if (!method_exists($controller, $action))
           $action = parent::getActionMethod($request);

copier la méthode getActionMethod de Zend_Controller_Dispatcher_Standard pour la surcharger
ajouter la ligne

Code:

        $method = ucfirst(strtolower($request->getMethod()));

remplacer :

Code:

return $this->formatActionName($action);

par

Code:

return $this->formatActionName($action.'.'.$method);

utiliser la méthode setDispatcher du controller pour utiliser le nouveau dispatcher

ainsi l'action index invoqué sera en fonction de la méthode :
indexGetAction ou indexPutAction ou indexPostAction en fonction de la méthode pour invoquer l'action
si l'action indexXxxAction n'existe pas c'est la méthode habituelle
qui sera appelé

ainsi on peut avoir indexAction pour traiter les appels à index standard et indexPutAction pour un traitement spécifique en cas de méthode PUT

Cordialement JYT

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages