Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 16-02-2009 16:45:54

creatix
Membre
Date d'inscription: 03-08-2008
Messages: 17

MVC, requêtes sql dans le contrôler?

Bonjour,

Voici une Action dans mon contrôleur, c'est ma première application avec ZF et aussi en MVC. Apres réflexion je me dit qu'il y a un problème... J'ai des requêtes sql dedans... c'est normal ?

Code:

    public function removeAction() {
        $this->view->message = '';
        $db = Zend_Db_Table::getDefaultAdapter ();
        $f = new Zend_Filter_StripTags ( );
        $name = $f->filter ( $this->_getParam ( 'id' ) );
        $migrateid = $f->filter ( $this->_request->getPost('migrate'));

        if ($this->_request->isPost() && isset($_POST['migrate'])) {
            Zend_Loader::loadClass ( 'Zend_Filter_StripTags' );

            if (isset($_POST['oui'])) {
                $id= $db->fetchAll ( "SELECT plan_id FROM  plan_list WHERE plan_name = '" . $name . "'" );
                $result2=$db->query("DELETE FROM plan_availability WHERE plan_id = '".$id[0]['plan_id']."'");
                $result=$db->query("DELETE FROM plan_list WHERE plan_name = '".$name."'");
                $result3=$db->query("UPDATE users SET plan_id='".$migrateid."' WHERE plan_id ='".$id[0]['plan_id']."'");

                if ( $result->rowCount($result) <> 1 ||  $result2->rowCount($result2) <> 1 || $result3->rowCount($result3) <> 1) {
                    $this->view->message = 'Erreur dans la suppression';
                }else {
                    $this->_redirect('/plan/list');
                }
            } else {
                $this->_redirect('/plan/list');
            }
        }
        $this->view->title = "Suppresion de plan";
        $this->view->content = "Voulez vous vraiment supprimer le plan : ".$name."";

        $form = $this->confirmationdelete($name);
        $this->view->form = $form;
        $this->render ();
    }

Hors ligne

 

#2 16-02-2009 17:02:16

dmathieu
Membre
Lieu: Lyon, France
Date d'inscription: 09-02-2009
Messages: 50
Site web

Re: MVC, requêtes sql dans le contrôler?

Non ca ne l'est pas smile
Tu n'a aucun modèle la.

Il te faut un modèle pour chacune de tes bases de données. C'est lui qui fait appel (automatiquement, en héritant de Zend_Db_Table_Abstract) et ce contrôleur fait appel aux méthodes du modèle.

Si ta méthode "delete" comporte de multiples requêtes, tu les place dans le modèle. Pas dans le contrôleur.

Ainsi si tu désire, à un autre endroit de ton application, supprimer un uplet, tu fait appel à ta méthode delete et tu ne répète pas toutes des requêtes.

A voir : http://framework.zend.com/docs/quicksta … base-table


Il faut aimer les autres, non pour soi, mais pour eux - Proverbe Espagnol

Hors ligne

 

#3 16-02-2009 17:36:04

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

Re: MVC, requêtes sql dans le contrôler?

pour faire simple et comprendre le fonctionnement de MVC tu fais une classe Modele
comme ça

Code:

class Model {

   protected $_db = null;

   public function __construct  () {
      $this->_db = Zend_Db_Table::getDefaultAdapter ();
   }

   public function findByName($name) {
      return $this->_db->fetchAll ( "SELECT plan_id FROM  plan_list WHERE plan_name = '" . $name . "'" );
   }

   public function deletePlanById($id) {
      return $this->_db->query("DELETE FROM plan_availability WHERE plan_id = '".$id."'");
   }

   public function deletePlanListByName($name) {
      return $this->_db->query("DELETE FROM plan_list WHERE plan_name = '".$name."'");
   }

   public function setUserPlanIdById($migrateid, $id) {
      return $this->_db->query("UPDATE users SET plan_id='".$migrateid."' WHERE plan_id ='".$id."'");
   }

}

ce qui te donne un contrôleur ainsi

Code:

    public function removeAction() {
        $this->view->message = '';
        $model = new Model ();
        $f = new Zend_Filter_StripTags ( );
        $name = $f->filter ( $this->_getParam ( 'id' ) );
        $migrateid = $f->filter ( $this->_request->getPost('migrate'));

        if ($this->_request->isPost() && isset($_POST['migrate'])) {
            Zend_Loader::loadClass ( 'Zend_Filter_StripTags' );

            if (isset($_POST['oui'])) {
                $id= $model->findByName($name);
                $result2=$model->deletePlanById($id[0]['plan_id']);
                $result=$model->deletePlanListByName($name);
                $result3=$model->setUserPlanIdById($migrateid, $id[0]['plan_id']);

                if ( $result->rowCount($result) <> 1 ||  $result2->rowCount($result2) <> 1 || $result3->rowCount($result3) <> 1) {
                    $this->view->message = 'Erreur dans la suppression';
                }else {
                    $this->_redirect('/plan/list');
                }
            } else {
                $this->_redirect('/plan/list');
            }
        }
        $this->view->title = "Suppresion de plan";
        $this->view->content = "Voulez vous vraiment supprimer le plan : ".$name."";

        $form = $this->confirmationdelete($name);
        $this->view->form = $form;
        $this->render ();
    }

tu as donc simplement séparé la couche M du Contrôleur.
pour aller plus loin tu découpe ton modèle en plusieurs classe en fonction des objet manipulé par exemple et tu auras la voie ouverte à une vrai implémentation de MVC
A+JYT

Hors ligne

 

#4 16-02-2009 18:11:28

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: MVC, requêtes sql dans le contrôler?

Salut,

Il y a plusieurs réponses à cette question.

Premièrement et simplement, si tu veux répondre correctement à la méthode de conception MVC, non tes requêtes ne sont pas au bon endroit smile

- Le controlleur invoque le modèle, prépare et transmet les données formatées qui doivent être affichées à la vue
- Le modèle traite la demande du controlleur (métier : SQL ou autre) et renvoie le résultat ou une réponse au controlleur
- La vue affiche les données envoyées par le controlleur.

Il faut donc que tu crées des classes représentant ta couche métier (données, Models = M de MVC) avec lesquelles communiqueront tes controlleurs.

Dans les controlleurs tu identifies le bon model, tu appelles la méthode de ce model qui te renvoie les données voulues, et c'est dans le model et dans la méthode que tu exécutes ton SQL et renvoie un résultat.

Le controlleur ne fait que recevoir le résultat et le préparer pour l'envoyer à la vue.


Après en dehors de MVC, si on réfléchie plus profondément à la conception, on peut ajouter une notion d'interface, que les codeurs ont plus ou moins le réflexe de faire, pas forcément proprement, et sans savoir que c'est un design pattern à part entière. Le terme façade (employé par sekaijin qui a indéniablement plus d'expérience que moi :p) est peut-être plus approprié je ne sais pas.

Une interface qui permet de cacher la partie métier (les données) au controlleur qui n'a pas besoin d'en connaitre l'organisation.

Le controlleur va lui communiquer toujours de la même manière avec l'interface, qui elle va se charger d'invoquer les modèles et servir de relais entre le métier et les controlleurs.

Pour être plus clair, c'est comme si ta partie métier pouvait parler soit français, soit russe, soit anglais, soit araméen, etc., et toi de ton côté tu inventes une langue universelle, tes controlleurs parlent tous cette langue, l'interface est un traducteur.

Première avantage : rendre encore plus simples les échanges, et donc pouvoir vraiment séparer plus efficacement les différentes parties du développement : métier, application, montage, en fournissant une documentation de l'interface.

Deuxième avantage : assurer la pérennité (interopérabilité) de l'application qui se détache totalement de la technologie utilisée pour la partie métier. Tu peux débrancher la partie métier et en rebrancher une autre, seule l'interface change.
De plus, si l'interface existe et que le métier est toujours à l'étude, ça permet de commencer le dev de l'application sans même avoir terminé la conception de la partie métier, l'application fonctionnera donc à vide.

C'est intéressant de se pencher sur cette question.

De mon côté je fonctionne toujours de cette manière, et je ne me soucie donc pas de ma partie métier, je peux y réfléchir tranquillement.

L'interface elle est étudiée de façon logique et regroupe un ensemble de méthodes parlantes.

C'est assez court, cette conception nécessiterait bien plus d'explications, mais c'est pour donnée une première approche, et ce n'est pas forcément ce que tu souhaites faire.


Mais ça pourrait pourquoi pas te donner envie d'approfondir la question :-)


A+ benjamin.

Dernière modification par Delprog (16-02-2009 18:17:18)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#5 16-02-2009 18:12:43

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: MVC, requêtes sql dans le contrôler?

Ah ben le forum était down, et après mon dernier F5 sur l'envoi du post tu avais déjà eu des réponses smile


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#6 16-02-2009 18:30:34

creatix
Membre
Date d'inscription: 03-08-2008
Messages: 17

Re: MVC, requêtes sql dans le contrôler?

merci à tous pour les réponses smile c'est beaucoup plus clair wink

Hors ligne

 

#7 16-02-2009 19:21:00

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: MVC, requêtes sql dans le contrôler?

Si la notion d'interface (ou façade) t'intéresse, je te conseille de consulter le blog de sekaijin (si je peux me permettre de te citer sekaijin hein :p) qui donne une approche beaucoup plus détaillée et pédagogique, dans laquelle il propose des exemples d'implémentation technique.

L'ayant implémenté avant d'avoir vu son article, je ne l'ai pas traduit de la même façon techniquement et je pense que sa conception est plus intéressante et plus souple grâce à son approche par composants.

A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#8 16-02-2009 20:37:22

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

Re: MVC, requêtes sql dans le contrôler?

Sorry j'ai lu ton message est j'ai écrit une réponse mais au moment de le poster panne de DNS
donc le voilà
pour faire simple et comprendre le fonctionnement de MVC tu fais une classe Modele
comme ça

Code:

class Model {

   protected $_db = null;

   public function __construct  () {
      $this->_db = Zend_Db_Table::getDefaultAdapter ();
   }

   public function findByName($name) {
      return $this->_db->fetchAll ( "SELECT plan_id FROM  plan_list WHERE plan_name = '" . $name . "'" );
   }

   public function deletePlanById($id) {
      return $this->_db->query("DELETE FROM plan_availability WHERE plan_id = '".$id."'");
   }

   public function deletePlanListByName($name) {
      return $this->_db->query("DELETE FROM plan_list WHERE plan_name = '".$name."'");
   }

   public function setUserPlanIdById($migrateid, $id) {
      return $this->_db->query("UPDATE users SET plan_id='".$migrateid."' WHERE plan_id ='".$id."'");
   }

}

ce qui te donne un contrôleur ainsi

Code:

    public function removeAction() {
        $this->view->message = '';
        $model = new Model ();
        $f = new Zend_Filter_StripTags ( );
        $name = $f->filter ( $this->_getParam ( 'id' ) );
        $migrateid = $f->filter ( $this->_request->getPost('migrate'));

        if ($this->_request->isPost() && isset($_POST['migrate'])) {
            Zend_Loader::loadClass ( 'Zend_Filter_StripTags' );

            if (isset($_POST['oui'])) {
                $id= $model->findByName($name);
                $result2=$model->deletePlanById($id[0]['plan_id']);
                $result=$model->deletePlanListByName($name);
                $result3=$model->setUserPlanIdById($migrateid, $id[0]['plan_id']);

                if ( $result->rowCount($result) <> 1 ||  $result2->rowCount($result2) <> 1 || $result3->rowCount($result3) <> 1) {
                    $this->view->message = 'Erreur dans la suppression';
                }else {
                    $this->_redirect('/plan/list');
                }
            } else {
                $this->_redirect('/plan/list');
            }
        }
        $this->view->title = "Suppresion de plan";
        $this->view->content = "Voulez vous vraiment supprimer le plan : ".$name."";

        $form = $this->confirmationdelete($name);
        $this->view->form = $form;
        $this->render ();
    }

tu as donc simplement séparé la couche M du Contrôleur.
pour aller plus loin tu découpe ton modèle en plusieurs classe en fonction des objet manipulé par exemple et tu auras la voie ouverte à une vrai implémentation de MVC
A+JYT

Hors ligne

 

#9 17-02-2009 18:54:57

eMeRiKa
Membre
Lieu: Paris
Date d'inscription: 05-02-2009
Messages: 50
Site web

Re: MVC, requêtes sql dans le contrôler?

La notion d'interface c'est le système d'abstraction de classe  (Zend_Db_Table_Abstract) où on manipule des Row et des Rowset c'est bien cela ?

Hors ligne

 

#10 18-02-2009 00:06:32

keilnoth
Membre
Date d'inscription: 30-08-2008
Messages: 128
Site web

Re: MVC, requêtes sql dans le contrôler?

Zend_Db_Table_Abstract permet de faire un modèle en 3 lignes :

Code:

class Table_Model extends Zend_Db_Table_Abstract {
    protected $_name = 'model' ;
}

et ensuite

Code:

$table = new Table_Model() ;
$table->insert($data) ;

Le mieux, à mon avis, étant d'étendre Zend_Db_Table_Abstract vers sa propre classe modèle de base et d'y ajouter des fonctions dynamiques de type fetchEntry, fetchAll, save, etc... qui fonctionneront facilement avec n'importe quelle table.

Ces classes ne sont pas des interfaces mais des classes abstraites. Row et Rowset disposent de leur propre classe abstraite que tu peux étendre de la même manière.

Code:

class Table_Model_Row extends Zend_Db_Table_Row_Abstract {
    ...
}

class Table_Model_Rowset extends Zend_Db_Table_Rowset_Abstract {
    ...
}

Tu spécifies que tu veux utiliser cette classe dans ton modèle de table en définissant la variable membre $_rowClass ou $_rowsetClass. Ensuite tous les "row" ou "rowset" retournés par ton modèle dériveront de ces classes. Libre à toi d'y ajouter n'importe quelle méthode.

smile


Quelques tutoriaux Zend Framework !

Hors ligne

 

#11 18-02-2009 09:22:07

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: MVC, requêtes sql dans le contrôler?

Salut,

La notion d'interface est indépendante de Zend et du modèle de conception MVC.

C'est une "couche" supplémentaire dans la conception et dans l'architecture d'un projet.

Elle permet d'uniformiser les échanges entre les controlleurs et la couche métier en servant de relais, de traducteur.

Plus concrètement, les controlleurs ne vont plus se servir directement dans les modèles, ils n'ont plus besoin d'en connaitre l'organisation.

Par ex., si un controlleur veut une liste de produits, il va faire sa demande à l'interface, par l'appel d'une fonction "normalisée" getListeProduits(), l'interface invoque elle les modèles de données et renvoie la liste des produits sous une forme également "normalisée" (il y a des abus de langage, mais c'est pour comprendre) et non des Zend_Db_Table_Row*, dans un format réutilisable et qui assure la pérennité de l'application quelque soit la complexité de la couche métier.

Tout ça permet de détacher totalement l'application de la couche métier, et de pouvoir développer l'application sans avoir terminée l'implémentation de la couche métier. Il suffit pour cela de concevoir l'interface et de la documenter. Le développeur de l'appli n'aura pas besoin d'en savoir plus.

Et ça permet évidemment d'assurer la pérénnité de l'application quelques soient les changements dans la couche métier. Seule l'interface change.


A+ benjamin.


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#12 18-02-2009 12:38:20

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

Re: MVC, requêtes sql dans le contrôler?

cela te permet surtout de séparer la couche métier de la couche persistance
les classes Zend_Db_*** sont des classe destinées à la persistance en base de données

si tu manipule par exemple un Plan un plan est un objet qui a certaine propriété et sur le quel on peut faire certaine chose. mais un plan n'est pas à priori un enregistrement dans une base de donnée.

ton objet métier est donc un plan
tu défini une classe Plan qui va contenir toutes les propriété et les méthodes définissant cet objet.

ton application va donc pouvoir manipuler des plans tu imagine que des classe d'objet comme celui-là ton application en manipule beaucoup

du coup tous tes contrôleur doivent connaitre ces classes métier pour pouvoir manipuler les objets.
ça peu vide devenir compliqué si tu change un objet métier il te faut faire le tour de tout tes contrôleurs pour répercuter la modif
ce que Delprog appelle un interface s'appelle en réalité une façade.
pour éviter en partit le problème précédent tu crée une classe qui va fournir des fonctions d'un haut niveau d'abstraction aux contrôleur et qui se chargera de connaitre le ou les objet métier à invoquer pour y arriver
comme dans ton exemple une seule fonction redifineUserPlan pourrait suffire à elle de savoir qu'il faut utiliser la classe plan et la classe user

tu noteras que je n'ai pas encore défini si ma classe plan permet de conserver ou pas les objet ni comment
cette partie là s'appelle la persistance. elle à pour but de définir quoi et comment on conserve les objets.
imagine que tes user soit dans un annuaire LDAP et tes plans dans une base. ça ne change rien sur ce qu'est un plan ou un user
ça change tout quant à la façon de conserver les objets. si tu veux garder tes plans en base il te faut donc définir une méthode pour le faire c'est là que les classes Zend_Db_** interviennent tu crée une classe
Model_Plan_Table qui dérive de Zend_Db_Table qui sera ta collection de Plans dans laquelle tu iras chercher tes plan tu peux aussi créer Model_Plan_Table_Row qui dérive de Zend_Db_Table_Row qui représente un enregistrement.  tu vas donc demander à la table de te donner quelque chose elle te donnera un row ces données là tu les place dans ton objet Plan pour le manipuler
dans le sens opposé tu prends les données de l'objet Plan tu en fais un Row que tu enregistre ou tu les donne à l'objet table pour qu'il les enregistres

tout cela n'a rien d'obligatoire mais cette séparation va te permettre de garder un capacité d'évolution que tu n'aurais pas sans. par exemple tes User son gérés en Base puis suite à une évolution de ton SI ils sont gérés dans LDAP (tu ne change que la partie persistance)

cela permet aussi d'améliorer la maintenance si tu à un problème sur un traitement métier c'est dans l'objet métier si tu as un pb pour lire ou enregistrer c'est dans la persistance

cela est un modèle de conception bien défini et la littérature abonde sur le sujet. maintenant il faut aussi être pragmatique si tu ne manipule qu'un seul type d'objet simple sans traitement métier et juste avec de la persistance il n'est peut être pas nécessaire de monter une usine à gaz

chez moi j'ai implémenté la chose de cette façon j'ai donc une façade entre le contrôleur et le modèle
plusieurs classe métier pour chaque classe métier si elle a de la persistance elle implémente un interface à moi appelée collectionnable qui dit simplement qu'on peu enregistrer l'objet
ensuite suivant le type de persistance fichier base LDP xml etc. j'ai une classe collection et une classe row
typiquement pour une base elles dérivent des classes Zend_Db_**
la classe collection se charge de l'acces au donnée et la classe row définit le format des données et le suivit des modifs

ma façade pour les objet persistant va contenir des chose comme getPlanById ou newPlan ou encore assingPlanToUser ces méthodes là vont déterminer quels objets doivent traiter la demande et les invoquer
mes objet métier persistant vont implémenter la méthode save de l'interface collectionnable et le controleur pour donc demander l'enregistrement en base par un simple appel à cette méthode c'est l'objet métier qui déterminera quelle est sa couche de persistance et qui lui demandera de faire le boulot que ce soit un ajout ou une mise à jour.

A+JYT

Hors ligne

 

#13 20-02-2009 12:29:37

ALkyD
Membre
Lieu: Limoges
Date d'inscription: 11-07-2007
Messages: 69
Site web

Re: MVC, requêtes sql dans le contrôler?

Bonjour,

J'ai bien lu les explications très claires ci-dessus, j'ai toutefois quelques questions :

1. Les assignations de variables $this->view->assign('var', 'value'), elles se font dans le controlleur ? J'ai tendance à le faire dans mon modèle puis à faire un return $view->render('monscript.phtml') car il se peut que j'ai besoin plusieurs fois du même rendu.

2. La création de formulaire se fait dans le modèle concerné ? Par exemple, ajouter une méthode createForm() dans mon modèle Model_Article (pour ajouter un article) qui dérive de Zend_Db_Table_Abstract ?

3. Le traitement des formulaires qui ont été envoyé se fait également dans le modèle ? Actuellement, je le fait dans le controlleur car j'ai besoin des variables $request et parfois $response, indisponibles dans le modèle (on pourrait mais ca ferait impropre).

Dernière modification par ALkyD (20-02-2009 12:30:52)

Hors ligne

 

#14 20-02-2009 14:10:10

Delprog
Administrateur
Date d'inscription: 29-09-2008
Messages: 670

Re: MVC, requêtes sql dans le contrôler?

Salut,

1 : Oui, les modèles ne doivent jamais communique directement avec les vues.
2 : Non. Les formulaires doivent pour moi être déterminés par la vue, leurs traitements par le controlleur. Je ne suis donc pas d'accord avec les choix de Zend de créer le formulaire (du html) depuis le controlleur, même si je comprend pourquoi ils l'ont fait.
3 : non

smile

Les modèles de données et les vues ne doivent jamais communiquer directement.

C'est justement le rôle du controlleur. Le controlleur sait ce qui doit être affiché et dans quelle forme (formatage) dans la vue (donc au client, à l'utilisateur, le résultat), et il sait comment le demander au modèle.

Son rôle est justement de faire le lien avec la couche métier et de comprendre les actions de l'utilisateur.

La vue ne doit faire qu'afficher (mise en page), les données envoyées par le controlleur qui lui les a préparé pour cet affichage.

Le modèle représente les données, leurs organisations et les traitements qui doivent leurs être associés.

Donc pour résumer :

- Le modèle manipule des données (au sens technologique du terme)
- Le controlleur invoque le modèle, prépare le résultat pour l'envoyer à la vue
- La vue affiche

Ici s'arrête la conception MVC.

Ce dont on parle plus haut doit être envisagé une fois que ces notions ont déjà été bien comprises.
La façade permet de réellement séparer la couche métier de la persistance. Ce que ne fait pas complètement le modèle de conception MVC, qui lui sépare des couches mais les laissent quand même dépendantes les unes des autres.


A+ benjamin.

Dernière modification par Delprog (20-02-2009 14:15:16)


http://www.anonymation.com/ - anonymation - Studio de création.
http://code.anonymation.com/ - anonymation - blog - développement et architecture web

Hors ligne

 

#15 20-02-2009 14:11:49

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

Re: MVC, requêtes sql dans le contrôler?

non le modèle ne connais pas et ne doit pas connaitre la vue

le modèle défini QUOI et la vue COMMENT
dans le modèle tu définis quel objets ton application manipule quelles sont les manipulation possible

dans la vue du définie comment tu présente ses objet comment tu donne accès à ces manipulation

et c'est au contrôleur d'assurer le CONTRÔLE c'est donc lui qui prends les données du modèle pour les mettre dans la vue (qui elle décidera comment les afficher) c'est encore lui qui récupère les donnée de la vue (GET POST) et qui les transmet au modèle c'est lui qui contrôle les action que demande l'utilisateur au travers de la vue et qui invoque les méthode du modèle pour effectuer le travail demandé.

théoriquement c'est à la vue de définir ce qu'elle fait des données si oui ou non elle les présente à l'utilisateur et comment elle le fait. c'est donc à elle de définir les formulaires.

mais un formulaire implique des traitements particuliers de la part du contrôleur Zend à donc choisit ce dernier pour définir les formulaires. c'est donc le contrôleur qui dans ZF gère les formulaires. et le passe tout pret à la vue.

en aucun cas le Modèle ne doit connaitre quoi que ce soit de la vue de même que la vue ne doit pas connaitre le modèle.

A+JYT

Hors ligne

 

#16 20-02-2009 14:55:34

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: MVC, requêtes sql dans le contrôler?

Hello,

Mes formulaires sont dans mes modèles. Le contrôleur demande au modèle le formulaire (->getForm()), si la requête est POST, je le vérifie (->isValid()) sinon je l'envoie à la vue.
Si la vérif est valide, je fais le traitement (avec réaffichage de la page ou non), sinon je l'envoie à la vue avec les messages d'erreurs.

A part un 'echo $this->form', je n'ai rien d'autre concernant le formulaire dans la vue.

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#17 20-02-2009 15:04:43

ALkyD
Membre
Lieu: Limoges
Date d'inscription: 11-07-2007
Messages: 69
Site web

Re: MVC, requêtes sql dans le contrôler?

sekaijin :

Par exemple pour mon contrôleur Article, chaque action 'ajouter' et 'editer' utilise un même formulaire, l'un l'affiche vierge et l'autre pré-remplis. Pour rester dans la logique du MVC, une simple méthode privée _getForm() dans le contrôleur fait l'affaire ? Et si j'ai besoin de réutiliser mon formulaire pour un autre contrôleur ?

Hors ligne

 

#18 20-02-2009 15:08:46

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: MVC, requêtes sql dans le contrôler?

ALkyD a écrit:

sekaijin :

Par exemple pour mon contrôleur Article, chaque action 'ajouter' et 'editer' utilise un même formulaire, l'un l'affiche vierge et l'autre pré-remplis. Pour rester dans la logique du MVC, une simple méthode privée _getForm() dans le contrôleur fait l'affaire ? Et si j'ai besoin de réutiliser mon formulaire pour un autre contrôleur ?

C'est bien pour cela que je les mets dans les modèles. J'ai dans ton cas un getFormAdd() et getFormEdit(), getEditForm surcharge getFormAdd en y ajoutant des champs si besoin (genre auto_increment de bdd). Pour le remplissage, tu fais un populate($data) sur le formulaire (Add ou Edit)

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#19 20-02-2009 15:23:24

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

Re: MVC, requêtes sql dans le contrôler?

pourquoi le contrôleur ne porte-t-il pas cette méthode ?
si le formulaire est utilisé dans plusieurs contrôleur pourquoi ne pas avoir une classe Application_Controller_Action dont les contrôleur dérive.

Il n'y a aucun intérêt à le mettre dans le modèle.

Imagine que tu doive utiliser dans une autre application ta classe article et que dans celle-ci il n'y a pas de formulaire. mieux l'IHM est faite en FLEX avec des formulaire Flex ou encore avec une vue en SVG

imagine que tu doive créer un service SOAP qui expose des fonctionnalité utilisant ta classe article

pour ce qui est de ton pb de form je ne fais absolument pas comme ça j'ai une action qui affiche un formulaire d'article elle ne fait rien d'autre
si une action comme edit ou add doit afficher le formulaire je fais un forward ou un redirect
si une action d'un autre contrôleur doit afficher le formulaire un redirect suffit

A+JYT

Hors ligne

 

#20 20-02-2009 15:52:04

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: MVC, requêtes sql dans le contrôler?

sekaijin a écrit:

pourquoi le contrôleur ne porte-t-il pas cette méthode ?
si le formulaire est utilisé dans plusieurs contrôleur pourquoi ne pas avoir une classe Application_Controller_Action dont les contrôleur dérive.

Il n'y a aucun intérêt à le mettre dans le modèle.

Imagine que tu doive utiliser dans une autre application ta classe article et que dans celle-ci il n'y a pas de formulaire. mieux l'IHM est faite en FLEX avec des formulaire Flex ou encore avec une vue en SVG

imagine que tu doive créer un service SOAP qui expose des fonctionnalité utilisant ta classe article

pour ce qui est de ton pb de form je ne fais absolument pas comme ça j'ai une action qui affiche un formulaire d'article elle ne fait rien d'autre
si une action comme edit ou add doit afficher le formulaire je fais un forward ou un redirect
si une action d'un autre contrôleur doit afficher le formulaire un redirect suffit

A+JYT

Très franchement, je ne vois pas le problème d'associer le formulaire au modèle plutôt qu'un contrôleur dans tes propos. La présence d'une méthode getForm() dans mon modèle n'influence pas les cas ci-dessus. Ou alors je passe à côté de qqch (sachant que je n'ai dormi que 3h, c'est pas non plus impossible wink ).

A part ça, je ne fais jamais de forward et le moins possible de redirect.

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#21 20-02-2009 16:43:35

3uclide
Membre
Date d'inscription: 09-08-2008
Messages: 194

Re: MVC, requêtes sql dans le contrôler?

J'ai une petite question concernant les models, je précise que j'utilise une facade (merci sekaijin) pour l'accès à mes données, cependant, est-il préférable de renvoyer une instance de Zend_Db_Table_Row en readonly ou un tableau avec des clés formattés?

Hors ligne

 

#22 20-02-2009 17:20:04

ALkyD
Membre
Lieu: Limoges
Date d'inscription: 11-07-2007
Messages: 69
Site web

Re: MVC, requêtes sql dans le contrôler?

Bonne question. Pour ma part, je renvoie toujours un tableau PHP (utile pour sérialiser ensuite en JSON dans le controlleur si par ex. on doit afficher des données via Ajax) ou un string, mais jamais une instance Zend_Db_*.

Dernière modification par ALkyD (20-02-2009 17:21:34)

Hors ligne

 

#23 20-02-2009 18:04:43

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

Re: MVC, requêtes sql dans le contrôler?

mikaelkael a écrit:

Très franchement, je ne vois pas le problème d'associer le formulaire au modèle plutôt qu'un contrôleur dans tes propos. La présence d'une méthode getForm() dans mon modèle n'influence pas les cas ci-dessus. Ou alors je passe à côté de qqch (sachant que je n'ai dormi que 3h, c'est pas non plus impossible wink ).

A part ça, je ne fais jamais de forward et le moins possible de redirect.

A+

il s'agit simplement de ne pas mélanger les choses si tu le fait ça va marcher mais tu vas perdre au passage les avantage de MVC

imagine que tu fasse construire une maison. tu es l'entrepreneur. tu va devoir coordonner les travaux de chacun. par exemple éviter que le plombier ou le peintre d'arrivé avant que les mur ne soit monté. tu vas aussi devoir définir ce que chaque corps de métier a à faire. par exemple lorsque le maçon à fini tu donne le mur au plâtrier puis lorsque le plâtrier a fini tu donne le même mur au peintre. (comme le contrôleur passe les infos du modèle à la vue)

maintenant tu est à cour de main d'œuvre et ton plâtrier sait peindre. pour une fois tu peux faire faire le boulot du peintre au plâtrier.

maintenant tu est promu dans un grand groupe de construction et tu ne gère plus la construction d'une maison mais de tout un lotissement tu vas vite comprendre que si chaque corps de métier empiète sur le domaine du voisin tu vas dans le mur big_smile

le problème de mettre le form dans le modèle c'est que tu présuppose dans les traitements comment il vont être utilisés je suppose que ton getForm te retourne un formulaire html. si ton application demain n'utilise plus html mais svg tu doit non seulement refaire les vue mais aussi toucher au modèle
c'est comme si repeindre ta voiture impliquait de changer une partie du moteur.

tout est possible et tout marche. mais MVC à été mis au point pour justement éviter de tout mélanger.

A+JYT

Hors ligne

 

#24 20-02-2009 18:54:05

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: MVC, requêtes sql dans le contrôler?

Je comprends à la lecture de ta parabole que pour toi un formulaire s'apparente plus au rendu, mais pas pour moi. C'est pour moi un objet capable de recevoir des données, de les filtrer, de les valider. Ensuite je passe l'objet Form à un objet View qui en effectue le rendu HTML. Pour moi un Zend_Form est donc plutôt lié à la gestion de données (donc au modèle) qu'au rendu.

Ton message me conforte tout de même dans l'idée de faire de l'informatique plutôt que d'aller dans le bâtiment big_smile.

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#25 20-02-2009 21:23:31

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

Re: MVC, requêtes sql dans le contrôler?

dans ce cas là IE ce n'est pas l'objet form qui fait le rendu mais l'a vue c'est un objet qui gère les donnée d'un formulaire c'est donc un objet de contrôle

un objet métier défini un concept pas l'usage qui en est fait je comprends que associer le formulaire au modèle facilite le travail mais ça resserre les liens et justement le but de MVC c'est de les découpler.

dans ce cas là je mettrais moi deux objet un métier et un de contrôle (un plugin de contrôler)

A+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