Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 23-04-2014 15:02:24

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 421

ZF2 Skeleton tutoriel avec doctrine

Voici le lien de mon repo sur github d'un skeleton regroupant mon travail de ces 3 dernières semaines, pour apprendre le zend framework 2 / doctrine / et les tests unitaires.
Je me suis rendu compte qu'il pouvait être utile à plus d'un titre même s'il peut surement être amélioré.

https://github.com/jonathangreco/zf2-doctrine-tutorial


Ce skeleton comprend :

Un getting started avec le module album version doctrine.
Une configuration toute prête pour jenkins, avec le build.xml qui vas bien. (Attention je travail sur un environnement windows)
Une utilisation de plusieurs base de donnée, une entityManager par DB.
Des tests unitaires pour chaque module mais centralisé en un seul dossier pour Jenkins.
Doctrine en lieu et place de Zend/DB pour commencer directement sur un ORM.

Merci à Orkin et Ocramius pour m'avoir pas mal aidé à le faire. J'espère que ça vous plaira.

Si jamais vous viens à l'esprit de le tester n'hésitez pas à me faire vos retours ou vos commentaires pour que je l'améliore (ou me faire un PR).

Je l'améliorerai moi même au fil du temps afin que des débutants puisse commencer directement par quelques chose de bien documenté et fonctionnel

Dernière modification par JGreco (23-04-2014 16:02:36)


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#2 23-04-2014 17:40:41

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1253

Re: ZF2 Skeleton tutoriel avec doctrine

Je déplace dans la bonne section.

J'irais faire un tour quand j'aurais le temps wink.

Hors ligne

 

#3 24-04-2014 11:45:03

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 421

Re: ZF2 Skeleton tutoriel avec doctrine

Merci Orkin smile
Et pour aller y faire un tour n'hésites pas ton avis m'intérrèsse grandement.

Je viens de mettre en ligne le petit outil(script) de création de module (qui fait moins bien son job que ZfTool) mais qui est plus spécifique pour ce que je voulais pour crééer mes nouveaux modules en respectant l'arborescence de mon getting started.

Ce petit outil est également sujet à beaucoup d'améliorations. La plus grosse consiste à pré-remplir les fichiers comme Module.php qui sont générique.
Voici le lien de ce petit script :
https://github.com/jonathangreco/zf2-createModule


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#4 27-04-2014 13:58:56

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1253

Re: ZF2 Skeleton tutoriel avec doctrine

Salut, je viens de regarder un peu je t'ai fait une pull request avec des corrections. J'ai pas tout corrigé et il y a des choses qui ne fonctionnent pas :

- A l'installation, penses à préciser que ta configuration de doctrine est à mettre dans le dossier autoload. Ce n'est pas précisé donc on ne le sait pas forcément. Ensuite une fois fait je lance la commande validate-schema (qui en soit à cette étape ne sert à rien puisque la base n'existe pas) et ça plante. En effet tu as défini un mapping pour des entités dans Application/Entity et le dossier n'existe pas. Pour plus de clarté dans tes modules tu peux créer un fichier doctrine.config.php pour y mettre uniquement la configuration de doctrine (tu l'inclus dans le module.config.php mais comme ça on voit en un coup d'oeil ce que fais chaque fichier de config. Tu pourrais séparer plus mais vu le peu de choses qu'il y a dedans ça vaut pas le coup).
Donc penses à bien documenter les étapes depuis une installation vierge (création de la base etc ...). Je t'ai mis à jour la doc vite fait. Pareil pour la console doctrine il n'y a plus besoin d'aller dans le dossier vendor c'est accessible depuis le fichier index.php du dossier public.
Pour le cache doctrine tu peux laisser array au lieu de filesystem. Si tu veux utiliser un cache tu as apc ou memcache qui sont beaucoup plus rapide. Le cache via filesystem est limité par les accès disque. Dans ton cas c'est pas gênant car peu de traffic mais sur des sites à fort traffic memcache ou apc sont beaucoup mieux car c'est un cache en RAM.

- Une fois l'installation faite, la page d'accueil du skeleton s'affiche. Je vais sur album et là a plantçe, il manque le template album/album/index . La raison, tu es sous windows et tu ne respectes pas les conventions de nommage (tiens ça me rappel un post ...) et comme linux est case sensitive sur les noms de dossier contrairement à windows ça ne fonctionne pas. Donc deux solutions, soit tu ne respectes pas les conventions de nommage et tu es obligé de définir un template map soit tu les respectes et c'est optionnel (mais recommandé quand même, c'est plus performant) et lorsque le template map est défini il faut retirer le template path stack ou du moins le spécifier après le template map. S'il est laissé il peut y avoir des oublis car il ira chercher automatiquement les templates qui ne sont pas dans le template map. Je t'ai donc rajouté le template map et modifié les noms des dossiers pour respecter les convetions : dans le dossier view => pas de majuscules (par exemple pour un module MonAlbum tu aurais mon-album).

- Ensuite pour récupérer l'entity manager je sais pas où tu as vu qu'il fallait récupérer la connexion mais $this->getServiceManager()->get('doctrine.entitymanager.orm_default') suffit.
Je t'ai modifié le code pour l'ajout d'un album, l'utilisation de doctrine que tu fais n'est vraiment pas bonne du tout ... Donc je te laisse regarder comment j'ai fait pour corriger ton code.
Getter/setter sur les attributs des modèles sinon l'hydration depuis les formulaires ne fonctionne pas.

- Les routes avec regexp, je t'en ai déjà parlé ... D'ailleurs dans les contrôleurs tu fais des tests sur l'id passé en paramètre dans la route, c'est inutile justement parce que tu as une contrainte sur l'id qui l'oblige d'être un nombre. Donc au niveau du router il ne matchera pas si tu mets une chaîne de caractères. D'ailleurs tu peux le tester facilement sur l'édition en remplaçant l'id par "toto" par exemple.
Je t'encourage à faire des childs route, là j'ai pas modifié cette partie.

- Dans ton contrôleur album c'est inutile d'utiliser un attribut de la classe si tu l'initialises dans chaque action, autant utiliser une variable ça revient au même. Le mieux reste d'utiliser les hard dependancies via une fabrique.

Voila grosso modo ce que j'ai vu, j'ai pas testé les tests et avec les modifications que j'ai fait il est possible que ça ne fonctionne plus. Par ailleurs penses à nettoyer un peu le code car il y a pas mal de fonction que tu as du copier/coller sur le net, qui ne te servent à rien comme getArrayCopy ou exchangeArray (avec Doctrine et les hydrator t'en a plus besoin).

Hors ligne

 

#5 28-04-2014 00:41:32

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 421

Re: ZF2 Skeleton tutoriel avec doctrine

Tout d'abord merci pour ton temps passé dessus, il y a de grande chance que demain en examinant et testant ton PR j'apprennes beaucoup (avec un exemple sous les yeux c'est plus ludique pour moi). Je te ferais les retours de tes retours bien entendu.

Je me doutais que beaucoup de chose soient à revoir c'est un peu pour cela que j'hésitais à partager cela, mais comment progresser sinon ! ;p

Oui le truc c'est que toutes ces bêtises sont issues de mes recherches et de la doc officielle, j'ai parfois pas tout compris ou suivit les mauvaises pratiques d'autres développeurs. Merci pour tout cela ce sont des conseils assez précieux.

A bientôt ! smile


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#6 28-04-2014 10:11:06

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1253

Re: ZF2 Skeleton tutoriel avec doctrine

T'as pas mal de choses à revoir wink. Mais je relirais pas à chaque fois hein, donc essaie de faire un peu plus de recherches pour voir comment faire et surtout trouver la meilleure façon (ou du moins celle qui te semble la plus propre) de faire les choses smile.

Hors ligne

 

#7 28-04-2014 11:40:39

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 421

Re: ZF2 Skeleton tutoriel avec doctrine

Merci, oui j'ai beaucoup à revoir mais c'est formateur ! pour les recherches ma foi j'en ai fait beaucoup, mais savoir distinguer le bien fait du mal fait quand on découvre c'est pas évident. J'ai compris pas mal de chose de ton PR, c'est vraiment sympa, par contre j'ai pas mal de questions.

En fait j'avais déjà essayé de faire par un constructeur dans ma classe AlbumService de récupérer l'objectManager pour éviter les répétitions, mais cela ne marchait pas. Je ne passais pas par une factory et cela devait surement venir de là. Pour mes convention de nommage dans les vues c'est une erreur toute bête issue de mon outil de génération de module perso....


1 - Tu peux me confirmer donc que : Pour passer un objet à un constructeur afin de l'initialiser il faut obligatoirement passer par une factory et donc FactoryInterface pour créer cette dépendance ?

2 - Pour ce qui est du Module.php : pourquoi avoir changé MvcEvent par EventInterface ? et avoir rajouté l’implémentation de toutes ces Feature ? Quel intérêt, nécessité ?

3 - Ton travail sur les formulaires :
      -  getInputFilterSpecification ressemble beaucoup a getInputFilter dans AlbumService, qu'elle es l'utilité de cette méthode dans AlbumFieldset ?
      - d'une manière générale je n'ai pas totalement compris la démarche de la création du formulaire avec ces trois fichiers (AddAlbumForm, AlbumForm et AlbumFieldset), aurait tu une doc sur le net qui puisse expliquer ceci ? Ou si tu peux m'expliquer brièvement la raison de ces 3 classes.

4 - ExchangeArray et getArrayCopy dans les Entity doit être présent, sinon j'ai une erreur pour l'édition(et peut être pas que). Il me dit que :

Code:

Zend\Stdlib\Hydrator\ArraySerializable::extract expects the provided object to implement getArrayCopy()
Zend\Stdlib\Hydrator\ArraySerializable::hydrate expects the provided object to implement exchangeArray() or populate()

Par contre je l'ai enlevé de la classe AlbumService en effet elle est inutile ici désormais.

Dernière modification par JGreco (28-04-2014 14:13:06)


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#8 28-04-2014 14:18:27

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1253

Re: ZF2 Skeleton tutoriel avec doctrine

1 - Si tu veux passer par le service manager oui tu es obligé (tu peux utiliser aussi le DI mais c'était quand il n'y avait pas encore le ServiceManager, on peut encore s'en servir mais je me souviens plus comment :p). La factory doit implémenter l'interface FactoryInterface.

2- En fait c'est pas obligatoire, c'est juste plus propre d'implémenter les interfaces qui vont bien. Tu veux rajouter une fonction pour la configuration dans le Module.php il y a une interface qui définie son implémentation. Dans le cas de onBootstrap l'interface demande que l'objet passé en paramètre soit un objet de type EventInterface et non MvcEvent. Donc j'ai fait la modif sinon il était pas content. Pour les autres c'est juste pour savoir d'où viennent les fonctions, on les a pas sorti du chapeau.

3- Le filtre est lié au modèle pas à un service donc il n'a rien à faire dans le service. Certains le mettent dans le modèle directement je trouve ça plus propre dans le fieldset puisqu'au final le fieldset c'est une représentation de ton modèle sous forme d'un formulaire. Et l'inputfilter a sert dans le cas de formulaires.
ProvidesObjectManager et ServiceLocatorAwareTrait sont des trait c'est présent pour palier à l'héritage multiple qui n'est pas possible avec PHP.
AlbumForm faut que tu le retires, je l'ai laissé pour pas que l'application plante parce que j'avais pas envie de tout changer. Tu as de la docs sur la doc officielle. En fait j'utilise le FormElementManager qui est un service manager spécialisé dans la création de formulaires (en gros il s'assure que l'instance retournée est bien de type Form). Le formulaire AddAlbumForm c'est le formulaire qui s'occupe d'ajouter un album là pour ton cas c'est ça se présente pas mais il doit y avoir des validateurs supplémentaires propre à l'ajout. Si je prend l'exemple d'un formulaire d'inscription et d'un formulaire d'édition de profile utilisateur tu vas dans l'inscription ajouter un validateur lié à l'inscription qui va vérifier si le mail et/ou le login n'est pas déjà utilisé tandis que dans la modification du profile tu ne peux pas faire ça car si tu vérifies si le mail et/ou le login existe il fera jamais la mise à jour lorsque tu modifie le mot de passe puisque le mail de l'utilisateur existe forcément. Dans ce cas tu vas vérifier s'ils sont uniques.

4- Non t'en a pas besoin c'est parce que ton code de l'édition n'est pas correct.

Hors ligne

 

#9 28-04-2014 14:45:05

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 421

Re: ZF2 Skeleton tutoriel avec doctrine

Merci,
Me suis rendu compte tout seul pour les trait et leur utilisation en effet c'est vraiment pratique.

Pour la question 1 je pense que c'est "motion adopté", rien à dire de plus.

J'ai retiré album form je vais m'employer a refaire l'edition et ça me fera bosser un peu doctrine pour faire un code propre et clair. Je mettrai a jour le code sur github une fois tout terminé.


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#10 29-04-2014 11:19:25

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 421

Re: ZF2 Skeleton tutoriel avec doctrine

Voila j'ai mis a jour le repo. De ce que j'ai pu effectuer comme travail :

- enlevé mon ancien formulaire et travaillé avec ta version + les fieldsets J'ai eu beau relire ce que tu as dit j'ai pas tout compris des fieldsets (surtout pour les validateurs de groupes)
- Correction du CRUD complet sur Album.
- J'ai ajouté le changement de la Locale FR en GB et inversement (la ici j'ai fait le choix de pas modifier l'url et de passer par la session, pas forcément la meilleure pratique je sais)
- Correction des tests unitaires qui ne marchait plus pour quelques uns (la j'ai eu quelques soucis que j'ai toujours pas solutionnés)
- nettoyage du code dans services et entity + commentaires
- Ajout des fam icones pour rendre cela plus 'joli'.

A faire :

- Readme.


Merci encore pour ton partial review j'ai beaucoup appris.

J'ai aussi pu remarquer en tombant par hasard dessus que tu avait faire la version zf2 de blogMVC de graphic Art, j'ai pu apprendre pas mal en regardant certaines parties du code, comme quoi y a pas a dire c'est en regardant du code et en le testant qu'on apprends le mieux (enfin dans mon cas)

Dernière modification par JGreco (29-04-2014 11:23:34)


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#11 29-04-2014 12:10:54

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1253

Re: ZF2 Skeleton tutoriel avec doctrine

Je viens de regarder ton commit :
- T'as viré le formulaire d'ajout, il ne fallait pas, un formulaire est lié à une action donc tu devrais avoir un formulaire d'ajout et de modification. Dans ton cas ça sera le mêmes effectivement vu qu'il y a pas de validateurs spécifiques pour l'ajout et la modification. Enfin la seule chose qui va changer c'est le nom du input pour soumettre le formulaire et ça t'évitera d'avoir à le faire dans le contrôleur.
- Checker l'id dans editAction ne sert à rien, si l'id n'est pas renseigné ou n'est pas un entier la route ne match pas donc ton test n'aura jamais lieu. Par contre tu peux tester si l'album existe.
- "un trait depuis php5.4 est en réalité une implémentation de méthodes génériques lorsque l'on implémente une classe. Ici ServiceLocatorAwareInterface implémente 2 méthodes abstraites, mais qui sont très générique partout puisqu'elle permettent de récupérer le serviceManager, le trait fait cela pour nous. Et le code reste qu'a un seul endroit." C'est faux, les méthodes ne sont pas abstraites ... Un trait je te l'ai dit c'est fait pour compenser l'héritage multiple. Ca n'a rien à voir avec des méthodes génériques ou autre, tu peux mettre ce que tu veux dedans.
- La phpdoc il y a des choses à respecter tu mets pas @param s'il y en a pas, @return doit indiquer le type de retour de la fonction (ça sert pour l'auto-completion) et pas que du texte. Regardes comment c'est fait dans les sources du ZF2 pour avoir des exemples. Rien ne t'empêche d'expliquer ce que c'est mais après avoir indiqué le type.
- Tes fonctions updateAlbum et deleteAlbum c'est pas bon tu récupères la connexion de l'entity manager

Donc t'as encore des choses à revoir wink. Essaies de corriger tout correctement je vais pas faire que vérifier, si tu veux proposer quelque chose de "qualité".

Ah oui, évites aussi de t'ajouter comme contributeur dans les fichiers où t'as rien fait. Personnellement je m'en fou mais certains n'aiment pas ça et sur des prochaines contributions ça pourrait t'être reproché et du coup être mal vu (genre comme quelqu'un qui s'approprie le boulot des autres wink).

C'est pas moi qui l'ai fait sur grafikart, j'ai fait une grosse relecture. Mais j'ai pas tout fait ni tout relu.

Hors ligne

 

#12 29-04-2014 12:39:07

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 421

Re: ZF2 Skeleton tutoriel avec doctrine

Ok j'en prends bonne notes, merci pour tout.


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#13 30-04-2014 14:12:43

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 421

Re: ZF2 Skeleton tutoriel avec doctrine

Si je puis me permettre une dernière question, dans le cadre de mes tests unitaires avec que tu fasses ton partial review, mes tests insérait une donné fictive, mettait a jour cette donnée et la supprimait ensuite.
Ce qui augmentait l’auto incrément de la table Album de 1.
Avec ton code, ce comportement à disparu (ce qui est exactement ce que je voulais donc je suis content)

Mais ma question est pourquoi ce comportement à changé ? Qu'est ce qui fait que mes tests restent valides mais sans insérer de donnée dans la base ? Je suis content du résultat mais je ne le comprend pas en fait smile si tu as une idée je suis preneur.


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#14 30-04-2014 18:15:24

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1253

Re: ZF2 Skeleton tutoriel avec doctrine

Aucune idée !

Hors ligne

 

#15 01-08-2014 11:52:28

calibhaan
Nouveau membre
Date d'inscription: 25-02-2009
Messages: 2

Re: ZF2 Skeleton tutoriel avec doctrine

J'ai une question dans l'utilisation des services. Dans ton application tu passe le service dans le constructeur et ensuite tu le garde dans une variable de classe.

Est-ce que l'on peut faire appel aux services grace au serviceLocator? Car personnellement c'est ce que je fais mais je ne sais pas si c'est propre ou pas.

en gros voila ce que ca donne:
Dans le controller:

Code:

$machineService = $this -> getServiceLocator( ) -> get( 'Noyaux\Service\MachineService' );

dans le Service Machine:

Code:

class MachineServiceFactory implements FactoryInterface {
    /**
     * (non-PHPdoc)
     * @see \Zend\ServiceManager\FactoryInterface::createService()
     * @return Application\Service\ApplicationService
     */

    public function createService( ServiceLocatorInterface $serviceLocator ) {
        
        $dbAdapter = $serviceLocator -> get( 'Zend\Db\Adapter\Adapter' );
        $resultSetPrototype = new HydratingResultSet( new ArraySerializableHydrator( ), new Machine( ) );
        $tableGateway = new TableGateway( 'hecout50', $dbAdapter, null, $resultSetPrototype );

        $table = new MachineService( $tableGateway );
        return $table;
   }

}

MachineService contient les fonctions de traitement

et sinon mon config est le meme niveau service_manager.

Hors ligne

 

#16 01-08-2014 13:12:40

JGreco
Modérateur
Date d'inscription: 22-12-2012
Messages: 421

Re: ZF2 Skeleton tutoriel avec doctrine

Bonjour déjà ?

Et puis non ce n'est pas propre de faire appel au service locator dans le controller je te renvoie vers ce post : http://www.z-f.fr/forum/viewtopic.php?id=9032


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#17 01-08-2014 18:15:16

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1253

Re: ZF2 Skeleton tutoriel avec doctrine

Salut, tu ne pourras plus utiliser le service manager dans les contrôleurs donc non c'est pas propre de faire comme ça big_smile.

Hors ligne

 

#18 04-08-2014 10:41:58

calibhaan
Nouveau membre
Date d'inscription: 25-02-2009
Messages: 2

Re: ZF2 Skeleton tutoriel avec doctrine

Oups bonjour oui désolé smile

Oki je le note alors et j'utiliserais une autre méthode.

Merci merci

Hors ligne

 

#19 04-08-2014 20:31:39

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1253

Re: ZF2 Skeleton tutoriel avec doctrine

La bonne méthode c'est les fabriques (factory)

Hors ligne

 

#20 17-04-2015 19:22:15

lalwende
Membre
Date d'inscription: 02-02-2011
Messages: 40

Re: ZF2 Skeleton tutoriel avec doctrine

tout simplement merci messieurs.


Just do it

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