Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 06-08-2009 10:25:39

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

[Proposition] dispatch des action en fonctio de la méthode(verbe http)

Bonjour une petit proposition à méditer avant la rentrée
la méthode dispatch de Z_C_Action est chargée d'invoquer une méthode en fonction de l'action définie par dans la requête. cette méthode ne tient pas compte du verbe http (le paramètre METHOD dans php)
pourtant les comportements de nos contrôleur devraient différer en fonction de ces verbes
le verbe HEAD ne devrait par exemple ne retourner que des header donnant entre autre le statut 304 No change lorsque rien n'a changé.
Or l'implémentation de ZF et l'usage qu'on en fait ne tient pas compte du protocole HTTP sur bien des points. la plus part du temps on répond comme pour un GET.
au mieux on test s'il s'agit d'un post de formulaire pour le traiter.

ma proposition consiste à automatiser la gestion de ces verbes en les faisant entrer dans le dispatch voici ma méthode revue (brute de fonderie, je vous la donne alors qu'elle viens de naitre et n'a pas subit la batterie de tests nécessaires)

Code:

    /**
     * Dispatch the requested action
     *
     * @param string $action Method name of action
     * @return void
     */
    public function dispatch($action)
    {
        // Notify helpers of action preDispatch state
        $this->_helper->notifyPreDispatch();

        $this->preDispatch();
        if ($this->getRequest()->isDispatched()) {
            if (null === $this->_classMethods) {
                $this->_classMethods = get_class_methods($this);
            }
            $method = ucfirst($this->getRequest()->getMethod());

            // preDispatch() didn't change the action, so we can continue
            if ($this->getInvokeArg('useCaseSensitiveActions') || in_array($action, $this->_classMethods) || in_array($action.$method, $this->_classMethods)) {
                if ($this->getInvokeArg('useCaseSensitiveActions')) {
                    trigger_error('Using case sensitive actions without word separators is deprecated; please do not rely on this "feature"');
                }
                if (in_array($action.$method, $this->_classMethods)) {
                    $action = $action.$method;
                }
                $this->$action();
            } else {
                $this->__call($action, array());
            }
            $this->postDispatch();
        }

        // whats actually important here is that this action controller is
        // shutting down, regardless of dispatching; notify the helpers of this
        // state
        $this->_helper->notifyPostDispatch();
    }

Ce n'est pas optimal mais ça donne clairement l'idée (c'est une surcharge de la méthode de Z_C_Action)

Concrètement que cela apporte-t-il ?
simplement la possibilité d'écrire des méthodes spécifiques pour des couples action verbe)

Prenons l'exemple du quickstart nous avons le formulaire sign
lorsque l'action est invoqué en mode POST il nous faut le vérifier et l'enregistrer lorsqu'elle est appelée en get il nous faut l'afficher.
plus besoin de tester

Code:

    /**
     * The sign action is responsible for handling the "signing" of the 
     * guestbook. 
     *
     * Assuming the default route and default router, this action is dispatched 
     * via the following url:
     *   /guestbook/sign with POST method
     *
     * @return void
     */
    public function signActionPost()
    {
        // now check to see if the form submitted exists, and
        // if the values passed in are valid for this form
        if ($this->_getGuestbookForm()->isValid($this->getRequest()->getPost())) {
            
            // since we now know the form validated, we can now
            // start integrating that data sumitted via the form
            // into our model
            $model = $this->_getModel();
            $model->save($this->_getGuestbookForm()->getValues());
            
            // now that we have saved our model, lets url redirect
            // to a new location
            // this is also considered a "redirect after post"
            // @see http://en.wikipedia.org/wiki/Post/Redirect/Get
            return $this->_helper->redirector('index');
        } else {
            return $this->_helper->redirector('sign');
        }
    }

ne sera invoqué que pour un POST

pour l'affichage deux solution soit en spécifiant que nous le voulons pour la mode GET soit quelque soit le verbe

Code:

    /**
     * The sign action is responsible for display the "signing" form of the 
     * guestbook. 
     *
     * Assuming the default route and default router, this action is dispatched 
     * via the following url:
     *   /guestbook/sign with GET method
     *
     * @return void
     */
    public function signActionGet()
    {
        // assign the form to the view
        $this->view->form = $this->_getGuestbookForm();
    }

Code:

    /**
     * The sign action is responsible for display the "signing" form of the 
     * guestbook. 
     *
     * Assuming the default route and default router, this action is dispatched 
     * via the following url:
     *   /guestbook/sign with any method other than POST
     *
     * @return void
     */
    public function signAction()
    {
        // assign the form to the view
        $this->view->form = $this->_getGuestbookForm();
    }

J'ai dans ce bout de code cherché à exposer mon idée et ce n'est surement pas quelque chose de directement exploitable mais on peux facilement entrevoir ce que serait la méthode signActionHead()

j'ai imaginé une autre approche. utiliser un predispatch qui invoquerait les méthodes signActionVerb avec la méthode signAction dans cette façon de faire la méthode action habituelle existerait toujours et le predispatch ferais le traitement spécifique avant. on aurait donc l'enchainement des deux méthodes par exemple
signActionPost suivit de signAction cette solution permets aussi de ne pas invoquer signAction après signActionHead il suffit dans celle-ci d'invoquer setDispatched(true)

les deux approche restent compatibles avec le code actuel et les deux apportent de la lisibilité dans le code
on peut imaginer comme amélioration des méthodes __actionVerb qui serait appelé si la méthode spécifique n'existe pas
par exemple signActionHead existe mais pas indexActionHead ni resetActionHead le systeme invoquerait alors __ActionHead pour les deux dernier cas et signActionHead pour le premier

enfin voilà ma réflexion.

A+JYT

Hors ligne

 

#2 06-08-2009 16:59:45

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: [Proposition] dispatch des action en fonctio de la méthode(verbe http)

Regarde Zend_Rest_Route, elle dispatche en fonction du verbe HTTP (API RESTful).

Hors ligne

 

#3 07-08-2009 09:17:59

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

Re: [Proposition] dispatch des action en fonctio de la méthode(verbe http)

je vais regarder de plus près
que pense-tu d'aporter cette possibilité au coeur de ZF ?
A+JYT

Hors ligne

 

#4 19-08-2009 10:03:26

mdelanno
Membre
Lieu: Nord
Date d'inscription: 26-08-2007
Messages: 90
Site web

Re: [Proposition] dispatch des action en fonctio de la méthode(verbe http)

C'est pas bête, mais ça présente peu d'avantages. En gros on déplace le test de la méthode d'interrogation du serveur Web de la méthode d'action vers Zend_Controller_Action. Ca rend les méthodes d'action plus propres., mais ça me semble peu utile à priori. Dans une application Web classique, on utilise le plus souvent uniquement GET et POST, HEAD est géré par le serveur Web ou un dispositif de cache. Donc au final, mis à part pour une API REST (et dans ce cas on dispose de Zend_Rest_Route comme l'a fait remarqué Julien), du routage qui tient compte de la méthode HTTP c'est pas une fonctionnalité indispensable.

Hors ligne

 

#5 19-08-2009 11:29:59

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: [Proposition] dispatch des action en fonctio de la méthode(verbe http)

...on utilise le plus souvent uniquement GET et POST...

Oui mais on détourne souvent l'utilisation de ces 2 méthodes (ex: formulaire de suppresion de donnée par post, idem quand on les édite, lien pour supprimer un item etc).

Hors ligne

 

#6 19-08-2009 14:19:18

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: [Proposition] dispatch des action en fonctio de la méthode(verbe http)

Mr.MoOx a écrit:

...on utilise le plus souvent uniquement GET et POST...

Oui mais on détourne souvent l'utilisation de ces 2 méthodes (ex: formulaire de suppresion de donnée par post, idem quand on les édite, lien pour supprimer un item etc).

Pour supprimer une ressource , il y a des cas ou un click suffit et ou la simplicité du <a> en HTML est apprécié par rapport à un <form> (a moins qu'on puisse appelé une méthode DELETE sans form ??) ce qui a provoqué ce détournement peut être.

Et l'avantage de la méthode GET (et POST), c'est que l'URI nous permet de comprendre immédiatement ce que l'on fait grace aussi notamment à nos nouvelles méthodes de route d'URI simplifié rien qu'en regardant la barre d'adresse de notre navigateur (l'accès au WWW étant très largement fait via des navigateur visuel dédié)

entre un GET sur /user/delete/id/3 et un DELETE sur /user/id/3/, je préfère le GET smile

Sans compté sur la complexité d'utilisation pour ma belle soeur si elle devait distingué ses méthodes pour utiliser Facebook !


----
Gruiiik !

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