2009-11-18 5 views
4

Dans tutoriels Zend Cadres, je peux voir le code de traitement des formulaires commeLe code de traitement de formulaire doit-il être extrait? (Zend_Form)

if ($request->isPost()) { 
      $formData = $request->getPost(); 

      $code = $request->getParam("code"); 
      $url = $request->getParam("url"); 

      if ($form->isValid($formData)) { 
      // here goes code to determine insert/update action, 
      //retrive record data 
      //and perform relative database operation 

Ce code se répète pour de nombreuses formes. J'essaie de mieux gérer la forme, mais pas de la sur-ingénierie. Jusqu'à présent, j'ai déplacé ce code de Controllers dans l'objet Form. Mais le code est toujours associé à des types de formulaire différents.

Ma question est - Si je préfère garder en double code de gestion de formulaire ou écrire une méthode Zend_Form ProcessSubmit() qui sera utilisé par toutes les sous-classes? J'ai eu l'expérience que l'abstraction n'est pas toujours bonne et parfois vous finissez par synchroniser deux classes qui auraient été différentes du début.

exemples de ZF démontrent le code en double, donc je me demande si cette duplicité est justifiées au (au moins pour les petits 3-4 sites formulaire) ou doit être évitée par tous les moyens.

P.S. Cette tâche semble être assez courante, je me demande si je fais un double travail et il existe déjà une classe ZF pour la gestion de formulaires spécifiques à CRUD.

+0

Vous ne devez pas déplacer ce code vers la classe de formulaire. C'est clairement le flux d'application et donc il appartient au contrôleur. Qu'entendez-vous exactement par duplication de code? La validation devrait se faire automatiquement en appelant 'isValid()', si vous spécifiez les champs dans la sous-classe de votre formulaire. – Franz

+0

Mon intention de déplacer le traitement des contrôles de formulaire dans la classe Form était le concept de «contrôleurs minces/modèles de graisse», par ex. http://blueparabola.com/blog/fat-models-are-good. Peut-être que mon erreur était de déplacer le code dans le formulaire alors que j'aurais dû déplacer le traitement formulaire/enregistrement dans le modèle. Que penses-tu de cela? – AlexA

Répondre

2

Peut-être un action helper pourrait, bien, aide vous ici:

class App_Controller_Action_Helper_ProcessFormSubmit extends Zend_Controller_Action_Helper_Abstract 
{ 
    public function isValid(Zend_Form $form) 
    { 
     if ($this->getRequest()->isPost()) { 
      return $form->isValid($this->getRequest()->getPost()); 
     } else { 
      return false; 
     }   
    } 

    public function direct(Zend_Form $form) 
    { 
     return $this->isValid($form); 
    } 

} 

Cela vous permet de gérer le traitement de soumission de formulaire comme ceci:

// or: if ($this->_helper->processFormSubmit->isValid($form)) { 
if ($this->_helper->processFormSubmit($form)) { 
    // here goes code to determine insert/update action, 
    //retrive record data 
    //and perform relative database operation 
} 

Cela peut être étendue à vos besoins , par exemple la gestion automatique des erreurs et ainsi de suite ...

1

Ce que j'ai effectivement fait était de déplacer la validation dans les objets de domaine (ou couche de modèle), puis ma couche de domaine met en œuvre une méthode de sauvegarde(). Bien que je n'utilise pas Zend_Form dans ma couche de domaine, j'ai remarqué que d'autres implémenteraient une instance de Zend_Form dans leurs modèles de domaine afin qu'ils puissent présenter une forme cohérente partout pour chaque modèle de domaine. Personnellement, je pense que cela couple trop les objets de domaine à la couche de présentation.

Au lieu de cela, je ne l'utilise Zend_Filter_Input comme l'épine dorsale de validation dans mes objets de domaine.

0

Si vous voulez utiliser « minces contrôleurs/modèles gras » après avoir validé la forme juste passer toute la forme ou la forme des valeurs à votre modèle.

En ce qui concerne les structures de contrôle dans votre contrôleur, ils sont « normaux ».

Questions connexes