Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#26 09-09-2013 15:57:30

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

Re: Formulaires, modèles et hydratation

Aucune idée, j'utilise Doctrine et je connais pas du tout Zend\Db smile.

Hors ligne

 

#27 16-09-2013 17:03:26

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Formulaires, modèles et hydratation

Apparemment ce n'est pas possible avec Zend\Db (j'ai regardé un peu le code des classes utilisées lors d'un select et ça n'a pas l'air de pouvoir retourner un tel résultat). Peut-être en utilisant l'hydrator du lien que j'ai fourni précédemment, mais je n'arrive pas à comprendre comment l'utiliser dans mon cas, c'est pas assez clair.
Pour contourner le problème j'appelle à nouveau mon hydrator dans la classe du premier objet, qui va remplir le "sous-objet". Ça fonctionne pour les relations OneToOne, et pour les OneToMany je ferai 2 requêtes (de toute façon c'est le mieux à faire lors d'une telle relation, d'après ce qu'on m'a dit).

J'ai appris à appeler le ServiceManager, dans les classes"invokables" de celui-ci, grâce à l'implémentation de ServiceLocatorAwareInterface.
Ça m'arrive souvent de l'utiliser dans d'autres classes, mais j'ai peur d'en abuser. Si j'ai besoin d'utiliser uniquement le SM dans une classe, c'est mieux d'utiliser la factory ou d'implémenter la classe de ServiceLocatorAwareInterface ?

Hors ligne

 

#28 17-09-2013 09:47:33

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

Re: Formulaires, modèles et hydratation

Tu peux implémenter ServiceLocatorAwareInterface, le test est fait pour chaque instanciation d'objet via le service manager donc autant en profiter. Par contre ne l'utilises pas dans tes modèles !!

Concernant les requêtes je fais parti de ceux qui préfèrent faire une grosse requête (à partir du moment où elle prend pas 3h00) plutôt que plusieurs petites surtout quand c'est une jointure assez classique.

Hors ligne

 

#29 17-09-2013 15:19:49

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Formulaires, modèles et hydratation

Orkin a écrit:

Par contre ne l'utilises pas dans tes modèles !!

Comment faire dans mon modèle dans ce cas ? Je n'en ai pas besoin dans mes classes *Table, mais pour mes hydrator si.

Quel est l'avantage de faire une requête plutôt que 2 ? Pour moi 2 ça serait mieux, car par exemple si je veux remplir un objet qui contient une collection d'un autre objet, le résultat de la requête contiendrait N fois le contenu du 1er objet (où N = le nombre d'objets de la collection).

Hors ligne

 

#30 18-09-2013 11:07:46

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

Re: Formulaires, modèles et hydratation

Ca c'est pas bien grave, les ORM sont capables de traiter ce genre de cas. La raison exacte je saurais pas te dire je pourrais dire des bêtises :p.

Tu dois trouver une meilleure façon de faire, peut être le faire depuis un service mais un modèle n'est pas censé avoir accès au service manager. Après je maitrise pas trop Zend\Db mais sur Doctrine ça ne se fait pas, en JAVA avec Hibernate non plus donc la logique voudrait que ça soit de même avec Zend\Db.

Hors ligne

 

#31 18-09-2013 17:51:31

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Formulaires, modèles et hydratation

Je peux aussi appeler la classe et instancier mon sous objet directement dans le modèle, mais ça revient à ne pas utiliser le ServiceManager qui contient déjà la référence vers cette classe.

Doctrine utilise les annotations d'après ce que j'ai pu voir, mais j'avoue ne pas aimer cette pratique.
Je pense que je vais finalement me tourner vers Doctrine pour les hydrators tout en gardant Zend\Db pour les tables, formulaires etc (du moins si c'est possible). C'est vraiment pratique de pouvoir générer automatiquement les modèles à partir de la BDD.

Hors ligne

 

#32 20-09-2013 06:52:57

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Formulaires, modèles et hydratation

En faite il n'y a que les hydrators dans Doctrine, il n'y a plus les classes *Table. Tout le reste est fait automatiquement.

Je commence doucement Doctrine, j'ai fait mes entités et après ma 1ere requête (je récupère un article et son auteur, relation ManyToOne, j'ai généré les entités à partir de la BDD existante) je constate que ZFTool m'affiche que 2 requêtes distinctes ont été réalisées. Je me pose donc la question, c'est une erreur de ma part ou bien tu t'es trompé en affirmant

Orkin a écrit:

Ca c'est pas bien grave, les ORM sont capables de traiter ce genre de cas

? :p

Je pourrais comprendre 2 requêtes pour une relation OneToMany, par contre je trouve ça abusé pour une relation ManyToOne.

Dernière modification par Seryus (20-09-2013 06:54:12)

Hors ligne

 

#33 20-09-2013 09:55:03

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

Re: Formulaires, modèles et hydratation

Tu n'es pas obligé d'utiliser les annotations pour doctrine, tu as d'autres formats disponibles smile.

En fait tout dépend de la façon dont tu fais ta requête, c'est là où il faut être exigent sur ton code. Doctrine permet le lazy-loading des données ce qui veut dire que lorsque tu récupères une entité Utilisateur (par exemple) qui a une relation vers Profil qui lui même a une relation vers les Droits sans rien configurer il va faire une requête uniquement pour récupérer le contenu de la table utilisateur ! Donc dans ce cas si tu souhaites récupérer les droits associer à son profil tu vas faire un getProfil() (génère une requête) puis getDroits() (génère une autre requête). Donc tu auras au moins 3 requêtes, ce qui est logique puisque tu lui a pas prévenu que tu voulais récupérer ces infos là à l'origine. Tu ferais pareil sur une application REST avec un appel sur 3 url pour récupérer ces infos si tu n'as pas tout retourné d'un coup.

Donc tu as deux solutions :
- Utiliser un repository où tu vas écrire ta requête en DQL, c'est pratique quand tu as des choses assez complexes à faire
- Renseigner les annotations fetch="EAGER" ta relation ManyToOne, ce qui signifie que doctrine va faire automatiquement la jointure !

Hors ligne

 

#34 20-09-2013 23:09:18

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Formulaires, modèles et hydratation

J'ai opté pour la 1ere solution car elle me permet de construire moi même mes propres requêtes via le QueryBuilder.
Par contre, on est obligé de récupérer tous les champs dans la requête ? J'ai essayé de construire ma requête via le QueryBuilder de l'EntityManager en créant moi même le "select" et le "from", mais ça me retourne un tableau en résultat (je veux récupérer l'objet Entity, j'utilise bien getOneOrNullResult et pas getArrayResult).
En créant ma requête via le QueryBuilder de ma classe Repository (qui étend de EntityRepository), ça ne me laisse pas le choix des colonnes à sélectionner.
Comment faire ?

Edit: J'ai finalement trouvé la solution, par défaut Doctrine récupère toutes les propriétés des entités. Si on ne veut récupérer que certains champs, il faut utiliser le mot clé "partial" dans le select.
Par contre j'ai pu lire sur la doc de Doctrine que ce n'était pas recommandé (car ça rend le code "fragile"), pourrais-tu me dire ce que tu en penses ?

PS: On est passé des formulaires au SM, puis à la base de données. Je pense qu'il faudrait peut être déplacer certains postes non (peut-être même changer de catégorie dans le forum) ? :p

Dernière modification par Seryus (21-09-2013 10:13:09)

Hors ligne

 

#35 22-09-2013 11:41:52

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

Re: Formulaires, modèles et hydratation

Tu peux renommer le sujet, je déplacerais si besoin.

En fait c'est le but de l'orm tu fais plus de SQL à proprement parlé tu récupères un objet donc ça n'a pas forcément de sens de récupérer une entité qu'à moitié remplie. Faut vraiment dissocier ces deux aspects : ORM  et SQL.

Tu peux tout à faire via doctrine écrire une requête SQL et remplir ton objet avec (c'est très fastidieux) mais c'est pas son but. Tu demandes à l'ORM de te retourner une entité en fonction de tel ou tel critère et c'est lui qui sait quoi faire.

Hors ligne

 

#36 23-09-2013 03:27:45

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Formulaires, modèles et hydratation

Je me suis peut-être trompé à propos des ORM dans ce cas. Pour moi on ne doit récupérer que les données dont on a besoin. Tout récupérer n'est ni avantageux au niveau des performances, ni de la sécurité, ni de la sémantique du code (même si sur ce dernier point je peux comprendre qu'un objet "incomplet" peut aussi poser des problèmes).

Doctrine nous force aussi à modifier notre base de données (obligation d'avoir une clé primaire par table alors que ce n'est pas forcément nécessaire, il ne supporte pas le type enum).

Selon la doc de Doctrine, il est recommandé d'utiliser le langage DQL pour faire des requêtes. Donc au final on ne fait que remplacer le SQL par un autre langage (qui sera lui même transformé en SQL), autant utiliser le SQL.

J'ai du mal à comprendre pourquoi les ORM tel que Doctrine sont aussi populaires (quels sont les vrais avantages ?), je préfère quelque chose de simple comme Zend\Db qui ne me pose pas tous ces inconvénients.

Hors ligne

 

#37 23-09-2013 10:02:03

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

Re: Formulaires, modèles et hydratation

Alors sur ce point je ne suis pas du tout d'accord avec toi !!

Seryus a écrit:

Doctrine nous force aussi à modifier notre base de données (obligation d'avoir une clé primaire par table alors que ce n'est pas forcément nécessaire, il ne supporte pas le type enum).

Les clés primaires et étrangères sont là pour que ta base de données garde une certaines cohérence. Certes c'est pas toujours utile d'avoir un id dans le cas d'une table de paramètres avec code => valeur par exemple mais ça ne coûte rien d'avoir un id. A mon sens toute table doit avoir une clé primaire (simple ou composée) donc là dessus doctrine ou hibernate d'ailleurs apportent un peu de rigueur !

Ensuite doctrine se sert des id pour mettre en cache les données. Il est possible d'appeler plusieurs la même donnée depuis la base de données et une seule requête SQL est générée car doctrine l'a récupéré en cache.

Pour ta première remarque tu y as répondu tout seul smile.

En fait que se soit par annotation ou directement en DQL doctrine fait le même genre de requête dans la mesure où tes annotations sont bien faites. Si tu as besoin d'une jointure et que tu n'as pas mis l'annotation fetch="EAGER" tu auras une requête supplémentaire lorsque tu vas vouloir récupérer cette infos. Là où le DQL est important c'est lorsque que tu n'as pas toujours besoin de cette jointure, tu ne peux donc pas te contenter d'une annotation. Le DQL s'écrit plus vite que le SQL mais c'est un détail et tu restes dans un esprit orienté objet ce que tu n'as pas en SQL.

Le gros avantage d'un ORM c'est d'apporter une couche d'abstraction à ta base de données. Si aujourd'hui tu as une base de données MySQL et que demain tu passes sur de l'Oracle tu n'as rien à faire à par changer le driver jdbc c'est tout. Chaque SGBD a ses propres fonctions et ses spécificités que tu peux complètement abstraire grâce à l'ORM. Ca permet aussi à des développeurs qui ne connaissent rien au SQL (si si ça existe) de pouvoir en faire.

Hors ligne

 

#38 23-09-2013 10:51:25

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Formulaires, modèles et hydratation

Orkin a écrit:

Le gros avantage d'un ORM c'est d'apporter une couche d'abstraction à ta base de données. Si aujourd'hui tu as une base de données MySQL et que demain tu passes sur de l'Oracle tu n'as rien à faire à par changer le driver jdbc c'est tout. Chaque SGBD a ses propres fonctions et ses spécificités que tu peux complètement abstraire grâce à l'ORM. Ca permet aussi à des développeurs qui ne connaissent rien au SQL (si si ça existe) de pouvoir en faire.

C'est pas tous les jours qu'on change de base de données, et encore moins de SGBD.
Ils devront quand même apprendre le DQL s'ils veulent faire des requêtes spécifiques, qui est très proche du SQL. Et puis je considère l'apprentissage du SQL "incontournable", si le développeur change de langage et qu'il doit interagir avec une base de données, les ORM ne seront pas toujours là.

Dans ZF2 il y a la manipulation de l'objet pour les requêtes aussi (je trouve d'ailleurs que la construction des requêtes est mieux pensé que Doctrine), il n'y a pas toutes ces contraintes que j'ai cité, pas autant de dépendances entre les composants et il me semble avoir vu qu'on peut aussi changer de driver en cas de changement de SGBD.

Hors ligne

 

#39 23-09-2013 11:28:32

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

Re: Formulaires, modèles et hydratation

C'est aussi le but de Zend\Db normalement. Là où ça diffère c'est qu'avec le DQL t'as pas à te soucier de savoir sur quel champ faire ta jointure etc ... Tu lui dis que tu veux récupérer tel champ de ton objet (qui est une relation) et hop il fait tout tout seul.

Rien ne t'empêche d'utiliser Zend\Db plutôt que Doctrine hein wink.

Hors ligne

 

#40 23-09-2013 12:00:01

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Formulaires, modèles et hydratation

Orkin a écrit:

Rien ne t'empêche d'utiliser Zend\Db plutôt que Doctrine hein wink.

Oui oui je sais, c'est ce que je vais faire je pense. À la base je voulais utiliser Doctrine pour la génération automatique des modèles et le résultat des requêtes qui a, au préalable, subit une transformation avant d'être retourné (ce dont je parlais plus haut). Mais je me suis rendu compte qu'il ne correspond pas du tout à mes attentes.
Je regarde actuellement le fonctionnement de Doctrine sur l'hydratation, pour voir si je peux me créer une classe qui étend de Zend\Db qui me retournera plus proprement le résultat des jointures (dans des "sous tableaux").

Merci pour ton aide en tout cas smile

Hors ligne

 

#41 06-02-2014 10:11:47

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Formulaires, modèles et hydratation

Bonjour,

Je remonte le sujet car je suis de nouveau tombé sur le 1er problème que j'avais (où l'élément Select ne vérifiait pas si le choix était bien dans la liste), je sais d'où ça vient, mais je n'arrive toujours pas à le corriger.

Par défaut, les éléments de formulaires ont des validateurs inclus. L'élément Select possède par défaut le validateur "InArray" qui vérifie que le choix est bien dans la liste des options (setValueOptions).
Le problème que j'ai, apparait lorsque je spécifie un validateur pour mon élément Select dans la fonction "getInputFilterSpecification", les validateurs par défaut sont écrasés par les validateurs que j'ai spécifié.
Ici je voulais juste modifier le validateur par défaut "required" pour le mettre à "false" (car par défaut il est à "true") mais ça écrase tous les validateurs par défaut de l'élément Select (y compris le "InArray" bien utile) !

Comment corriger ce problème ?

Hors ligne

 

#42 06-02-2014 10:50:33

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

Re: Formulaires, modèles et hydratation

Salut, oui par défaut tous les composants complexes du formulaire ont un required à true. C'est pas toujours logique mais ça se change facilement via le getInputFilterSpecification. Par contre tu dois mal le faire je pense parce que c'est pas censé retirer les validateurs déjà présent ça n'a aucun sens. L'intérêt de ce composant c'est justement d'éviter d'avoir à le faire à la main.

C'est quoi ton code pour mettre le required à false ?

Hors ligne

 

#43 06-02-2014 10:54:02

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Formulaires, modèles et hydratation

Tout simplement

Code:

[lang=php]
public function getInputFilterSpecification()
{
    return array(
        'elementName' => array(
            'required' => false
        )
    );
}

dans mon fieldset

Hors ligne

 

#44 06-02-2014 11:01:54

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

Re: Formulaires, modèles et hydratation

Bizarre effectivement ... Je viens de regarder j'ai un code similaire avec un required = true sur un composant select de doctrine (c'est absurde je sais :p) mais ça me retire pas les autres validateurs. Tu peux essayer de voir si tu as le même comportement avec required à true. Mais Il n'y a pas de raisons que ça les retire de toute façon !

Tu as un message d'erreur spécifique ?

PS : tu as quand même des problèmes bizarres wink !

Hors ligne

 

#45 06-02-2014 11:34:58

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Formulaires, modèles et hydratation

Non pas de message d'erreur.
J'ai copier/coller le code de la doc sur les fieldset en l’adaptant au mien, j'ai toujours le même problème.

Un required à true m'enlève aussi les validateurs de base.

As-tu essayé avec l'élément Select de ZF2 ?

Orkin a écrit:

PS : tu as quand même des problèmes bizarres wink !

Oui malheureusement, je m'en passerais bien sad

Hors ligne

 

#46 06-02-2014 11:42:43

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

Re: Formulaires, modèles et hydratation

C'est curieux, au pire tu rajoutes ceux du ObjectSelect te prend pas la tête. Tu dois louper un truc mais je vois pas quoi :'(.

Hors ligne

 

#47 06-02-2014 12:06:50

Seryus
Membre
Date d'inscription: 17-02-2012
Messages: 128

Re: Formulaires, modèles et hydratation

J'ai essayé un copier/coller du code de la doc sans le modifier (à part le rajout de required à false sur l'url dans la fonction "getInputFilterSpecification") dans un nouveau module et le même problème est présent. Ça ne vient donc pas de moi non ?

Sinon je peux passer de nouveau le validateur "inArray", mais ça fait pas très propre je trouve. Je le supprime (malgré moi) pour le remettre et je dois aussi gérer l'option à null.
Je m'en contenterai quand même pour le moment sad

Edit : Pour ceux qui aurait ce problème, on peut le contourner ce "bug" avec :

Code:

[lang=php]
$formulaire->getInputFilter()->get('monElement')->setRequired(false);

une fois le formulaire instancié. C'est mieux que de repasser chaque validateur à l'élément wink

Dernière modification par Seryus (05-03-2014 10:28:56)

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