IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MVC PHP Discussion :

MVC dans Zend [ZF 1.10]


Sujet :

MVC PHP

  1. #1
    Membre très actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Par défaut MVC dans Zend
    Bonjour.

    Simples questions concernant le MVC.

    Je viens de voir qu'il était plus correct, pour la normalisation MVC, de mettre les formulaires Zend dans le dossier model de notre appli'.
    Cependant, dans la plupart des tuto' pour nous apprendre à developper avec ZF, le dossier form se trouve dans application directement (ou dans application/modules/).
    Ma question est donc la suivante : où doit-on placer le dossier contenant nos formulaires ? Je vais développer une appli' modulaire, donc de préférence j'aimerais une réponse en conséquence SVP

    Autre point, toujours par rapport au MVC, il est conseillé de faire tous les traitements dans les modèles et non dans les controlleurs. Mais là, encore une fois, dans les tuto' ces traitements (genre vérifier que le formulaire a bien été rempli etc.) sont fait dans les controlleurs...
    Qui faut-il croire/écouter au final ?
    Et si il faut donc tout faire dans les modèles, est-il possible de vérifier les données d'un formulaire (simple exemple) dans le modèle et non dans le controlleur ?
    Exemple de code vérification du form :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $form = new FormulaireAlbum();
            $form->submit->setLabel('Ajouter');
            $this->view->form = $form;
            if ($this->_request->isPost()) {
                $formData = $this->_request->getPost();
                if ($form->isValid($formData)) {
                    $albums = new Albums();
                    $row = $albums->createRow();
                    $row->artist = $form->getValue('artist');
                    $row->title = $form->getValue('title');
                    $row->save();
     
                    $this->_redirect('/');
                }
                else
                    $form->populate($formData);
            }
    Ce code est-il possible à déplacer dans le modèle ?

    Merci d'avance !

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 118
    Par défaut
    Bonjour,

    Personnelle j'ai codé une application modulaire, où chaque module est autonome comme si c'était une application à part entière et le module 'core' s'occupe en autre de scruter et fusionner tous les paramétrages des autres modules pour en faire qu'une seule application, bref...

    Si tu suis les recommandations de ZF
    ton fichier à l'emplacement suivant (dans le cas du module 'core' par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    root/application/modules/core/forms/Album.php
    Sa classe (je te recommande une extension App_Form extends Zend_Form) pour définir un même comportement pour tes formulaires (décorateur et validateur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class core_Form_Album extends App_Form {
    ....
    }
    Dans ton controller
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $form = new core_form_Album ();
    Si tu prends le fichier Zend_Application_Module_Autoloader du Zf, il te dit le comportement par défaut de l'autoloader des modules, suit ce schéma cela évite des problèmes par la suite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
        /**
         * Initialize default resource types for module resource classes
         *
         * @return void
         */
        public function initDefaultResourceTypes()
        {
            $basePath = $this->getBasePath();
            $this->addResourceTypes(array(
                'dbtable' => array(
                    'namespace' => 'Model_DbTable',
                    'path'      => 'models/DbTable',
                ),
                'mappers' => array(
                    'namespace' => 'Model_Mapper',
                    'path'      => 'models/mappers',
                ),
                'form'    => array(
                    'namespace' => 'Form',
                    'path'      => 'forms',
                ),
                'model'   => array(
                    'namespace' => 'Model',
                    'path'      => 'models',
                ),
                'plugin'  => array(
                    'namespace' => 'Plugin',
                    'path'      => 'plugins',
                ),
                'service' => array(
                    'namespace' => 'Service',
                    'path'      => 'services',
                ),
                'viewhelper' => array(
                    'namespace' => 'View_Helper',
                    'path'      => 'views/helpers',
                ),
                'viewfilter' => array(
                    'namespace' => 'View_Filter',
                    'path'      => 'views/filters',
                ),
            ));
            $this->setDefaultResourceType('model');
        }
    Concernant les validateurs et filtres, je ne mets rien dans mes Zend_Form mais j'utilise ma propre extension de Zend_Filter_Imput qui permet de tous mettre dans une seule classe, c'est très pratique et sans lourdeur du code.

    Mon rêve est de pouvoir transformer le Zend_Filter_Input en validateur et filtre javascript pour faire une vérification dans un premier temps sur le poste client, un peu comme le fait GWT, mais on peut encore réver.

  3. #3
    Membre très actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Par défaut
    D'accord donc tu places bien tes forms dans les modules directement et non dans les models.
    J'aimerais avoir d'autres avis histoire de me faire une idée plus générale mais merci de ta réponse !

    Ensuite, tu dis que tu fais tout dans une seule classe au niveau des validateurs etc., ok mais si j'ai envie de garder mes classes à part (MVC quoi), où est-ce que je dois les placer ? Dans les controlleurs ou les modèles ?
    Merci !

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 118
    Par défaut
    Ensuite, tu dis que tu fais tout dans une seule classe au niveau des validateurs etc., ok mais si j'ai envie de garder mes classes à part (MVC quoi), où est-ce que je dois les placer ? Dans les controlleurs ou les modèles ?
    Je ne vois de qu'elle classe dont tu veux parler, mais pour t'éclairer et t'apporter d'autres idées ; en dehors des ressources habituelles (helper, helperview, service, plugin ...) dont l'autoloader fonctionne par défaut, pour un module j'ai besoin de classe spécifique.

    Ici dans notre cas j'ai besoin d'une class class core_My_Filter_Input extends Zend_Filter_Input pour mon module "core"

    Le problème est quand dans mon controller je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $myFilter = new core_My_Filter_Input();
    L'autoloader ne fonctionne pas, normal.

    Donc comme tous mes modules se basent sur une même arborescence de dossier, dans le bootstrap je déclare un nouvelle emplacement de ressources, et de ce fait un espace de nom nomModule_Mypour le dossier nomModule/My
    Mise à part, une classe qui me donne les noms des dossiers des modules dans le dossier application/modules, le reste du code est assez explicite.
    A coller dans le bootstrap.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    /**
    	 * Découvre tous les modules et leurs appliquent 
    	 * un autoloader commun (structure identique) 
    	 *
    	 * @return Zend_Application_Module_Autoloader
    	 */
        public function _initAutoload()
    	{
     
    		$autoloader = Zend_Loader_Autoloader::getInstance();
     
                    $modules  = App_Module_Loader::getInstance()->getModuleNames();
     
    		foreach ($modules as $module) {
    			$moduleLoader = new Zend_Application_Module_Autoloader (array(
        			'basePath'  => APP_DIR . 'modules' . DS . $module,
        			'namespace' => $module . '_',
    			));
     
    			$moduleLoader->addResourceTypes( array( 
    									'My'  => array(
    								           'path'      => 'My'
    	         							 , 'namespace' => 'My')
    	         							 ));        	
    		}
     
    		return $autoloader;
     
    	}//Eof::_initAutoload
    Pour continuer sur le sujet, je me suis inspiré du CMS Tomatocms open source http://www.tomatocms.com/ qui se base sur le ZF.
    Il y a de bonne idée sur le découpage en module et notamment pour le système qui scrute l'ensemble des modules et des configs à chaque passage dans le bootstrap.
    Je suis allée plus loin dans leur idée en fusionnant l'ensemble (à l'installation) des configs (des différents module) dans un config commun dans le module "core" pour soulager le bootstrap.

  5. #5
    Membre très actif Avatar de DarkSeiryu
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    425
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 425
    Par défaut
    D'accord, pas mal l'idée de mettre une boucle dans le bootstrap pour charger les modules ^^

    Merci pour le lien, j'irai jeter un coup d'oeil.

    Merci de ton aide freeseb !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Point d'arrêt dans Zend Studio
    Par Claude_Azoulai dans le forum Zend Studio
    Réponses: 6
    Dernier message: 04/03/2008, 22h01
  2. Réponses: 1
    Dernier message: 28/11/2007, 11h52
  3. Interet du mécanisme MVC du Zend framework
    Par Graffito dans le forum MVC
    Réponses: 4
    Dernier message: 28/06/2007, 00h35
  4. [eCommerce] Utilité du MVC dans le E-commerce ?
    Par ecom_adil dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 10/03/2007, 12h00
  5. [Spring MVC] Architecture MVC dans spring
    Par Alec6 dans le forum Spring Web
    Réponses: 4
    Dernier message: 11/10/2006, 12h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo