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

Doctrine2 PHP Discussion :

Mapping XML


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut Mapping XML
    Bonjour à tous,
    récemment je me suis plongé dans doctrine étant donné qu'il offre pas mal de chose, donc j'ai commencé à le manipuler hors de symphony pour mieux comprendre son fonctionnement.
    Avant, j'ai utilisé ce que Doctrine fournit concernant la génération des entités au format php en utilisant les docblock annotation, tout fonctionne correctement mais au fil du temps, je commence à en avoir marre de voir les annotations car si par exemple j'ai une table contenant + de quinzaine de champs , la classe générée devient de plus en plus volumineuse avec les getters et les setters.
    Je me suis tourner donc vers xml mapping car personnellement je le trouve plus structurer par rapport au php mapping.
    J'ai donc deux tables comme test (Category et product avec une relation one to one bidirectionnelle), j'ai créer aussi une classe (même procédure que la classe EntityGenerator.php) permettant de générer les fichiers xml.
    Les fichiers générés, stockés dans un dossier /ressources/models/ ressemblent à ça :
    Category :
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
    	https://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd">
        <entity name="Category" table="category">
            <id column="id" name="id" type="integer">
                <generator>
                    <strategy>SEQUENCE</strategy>
                </generator>
                <sequence-generator>
                    <sequence-name>category_id_seq</sequence-name>
                    <allocation-size>1</allocation-size>
                    <initial-value>1</initial-value>
                </sequence-generator>
            </id>
            <field column="libelle_category" name="libelleCategory" type="string" />
            <one-to-one field="product" mapped-by="idCategory" target-entity="Product" />
        </entity>
    </doctrine-mapping>
    Product :
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
    	https://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd">
        <entity name="Product" table="product">
            <id column="id" name="id" type="integer">
                <generator>
                    <strategy>SEQUENCE</strategy>
                </generator>
                <sequence-generator>
                    <sequence-name>product_id_seq</sequence-name>
                    <allocation-size>1</allocation-size>
                    <initial-value>1</initial-value>
                </sequence-generator>
            </id>
            <field column="libelle_product" name="libelleProduct" type="string" />
            <one-to-one field="idCategory" inversed-by="product" target-entity="Category">
                <join-column name="id_category" referenced-column-name="id" unique="true" />
            </one-to-one>
        </entity>
    </doctrine-mapping>
    Mon problème, c'est que j'arrive pas à accéder aux entités en utilisant le même syntaxe que pour le php mapping.
    Le syntaxe suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $category = $entityManager->find('Category',1);
    me renvoie une erreur,
    je sais pas si j'ai loupé certaines explications étant donné que suis pas très top en anglais, mais ce que je veux savoir c'est comment on y accède aux entités ? faudrait-il créer une classe pour chaque modèle ? si c'est le cas comment procède-t-on ? quelle sera sa structure ? les variables qu'on y définit etc..

    En espérant de l'aide de votre part.

    Cordialement

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,

    Tu auras toujours besoin d'une classe php avec ses attributs, ses getters et ses setters (donc que tu choisisses les annotations ou le xml, tu auras toujours les mêmes classes php, avec le même nombre d'attributs et de getter/setter).

    Ensuite il faut fournir à Doctrine le mapping entre les attributs de tes classes php, ce mapping pouvant être défini par les annotations, le xml ou le yml .

    Doctrine fournit de nombreux outils de génération
    ->génération des tables de la BDD à partir du mapping
    ->génération du mapping à partir de la BDD
    ->génération des classes php à partir du mapping
    http://docs.doctrine-project.org/en/...nce/tools.html

    cela n'interdit aucunement de modifier les classes générés pour y ajouter ses propres méthodes (pourvu que l'on ne touche pas aux attributs mappés).

    ...
    <field column="libelle_product" name="libelleProduct" type="string" />
    <one-to-one field="idCategory" inversed-by="product" target-entity="Category">
    <join-column name="id_category" referenced-column-name="id" unique="true" />
    </one-to-one>
    ....
    Je te conseilles de bien surveiller la façon dont tu nommes les attributs de tes classes et de privilégier la simplicité, car cela porte à confusion, la logique Objet étant différentes de celle d'une base de données relationelle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!---->
           <field column="libelle_product" name="libelle" type="string" />
    <!--inutile de préciser libelleProduct puisque c'est un attribut de la classe Product: $product->getLibelle() se suffira en lui-même-->
            <one-to-one field="Category" inversed-by="product" target-entity="Category">
    <!-- cet attribut est de classe Category en le nommant idCategory on pourrait croire que c'est un entier; alors que pour récupérer l'id catégory il faut faire:  $product->getCategory()->getId()  ---->
                <join-column name="id_category" referenced-column-name="id" unique="true" />
            </one-to-one>
    <!---->

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut
    Merci bcp pour ton aide arnooo999,

    Ok, donc si je comprends bien, quelque soit le type de mapping que j'utilise il me faudra tjs déclarer une classe (avec les attributs et les méthodes). Par contre dans mon cas, j'aurais plus besoin de déclarer les annotations dans ma classe non ? puisque le xml se charge de sa relation avec la BDD ?
    Juste une question, est-ce-que c'est l'attribut name dans la balise entity qui sera le nom de ma classe php ?

    Encore merci,

    Cordialement

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    est-ce-que c'est l'attribut name dans la balise entity qui sera le nom de ma classe php ?
    oui
    cf:
    http://docs.doctrine-project.org/en/...ning-an-entity

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut
    Oui, et ça a marché, je peux accéder aux entités sans problème
    Par contre y aura t-il une possibilité de séparer dans différents dossier le mapping et l'entité : ex ts les mappings dans un dossier Mapping et les entités dans un autre dossier pour éviter une mauvaise manip des mappings.

    Encore merci pour ta réponse

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations forums :
    Inscription : Juillet 2011
    Messages : 6
    Par défaut
    Ah , c'était dans le lien que tu m'as donné aussi

    Merci

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

Discussions similaires

  1. Réponses: 14
    Dernier message: 21/02/2010, 19h02
  2. [MAPFORCE] EDIFACT et mapping XML
    Par ujoodha dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 14/10/2009, 15h30
  3. Réponses: 5
    Dernier message: 15/12/2006, 11h51
  4. [JRE1.4 Eclipse3.1.1 Hibernate3.1] Mapping XML
    Par mow dans le forum Hibernate
    Réponses: 2
    Dernier message: 08/10/2006, 13h20
  5. [Java] Mapping XML <> Java
    Par webspeak dans le forum Persistance des données
    Réponses: 7
    Dernier message: 22/06/2006, 00h07

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