Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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
il y a peut être une voie à creuser pour toi.
$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.
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
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 :
/** * Retrieve the action name */ $action = $this->getActionMethod($request);
et les remplacer par
/** * 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
$method = ucfirst(strtolower($request->getMethod()));
remplacer :
return $this->formatActionName($action);
par
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