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

Symfony PHP Discussion :

Modèle


Sujet :

Symfony PHP

  1. #1
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 623
    Points : 1 370
    Points
    1 370
    Par défaut Modèle
    Bonjour à tous,

    je continu mon apprentissage de Symfony 2, j'ai globalement compris comment tout fonctionne et la je m'attaque au Model et j'ai un peu de mal.

    Mon code se trouve dans le dossier "Farid" et mon bundle s'appel "TestBundle".

    J'ai une base de données appelé "symfony_db" avec une table "users" qui contient 2 champs, "id" et "name".

    J'ai configurer Symfony pour qu'il puisse se connecter à ma bdd, j'ai fait une requête dans mon contrôleur et j'obtiens bien le résultat dans ma vue.

    Maintenant, j'aimerai bie utiliser l'ORM correctement.
    1 - Pouvez-vous m'expliquer la différences entre ORM, DBAL par rapport à PDO?

    app/config/config.yml :

    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
    # Doctrine Configuration
    doctrine:
        dbal:
            driver: pdo_mysql
            host: localhost
            dbname: symfony_db
            user: root
            password: null
            logging:  %kernel.debug%
     
        orm:
            default_entity_manager: default
            entity_managers:
                default:
                    mappings:
                        TestBundle: ~
    Que faut-il que je mette dans mappings


    Farid/TestBundle/Entity/User.php :

    Code PHP : 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
    <?php
     
    namespace Farid\TestBundle\Entity;
     
    class User
    {
        protected $id;
        protected $name;
     
        public function getId()
        {
            return $this->id;
        }
     
        public function setName($name)
        {
            $this->name = $name;
        }
     
        public function getName()
        {
            return $this->name;
        }
    }

    Farid/TestBundle/TestController.php :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
        public function baseAction($id)
        {
            //$conn = $this->get('database_connection');
     
            //$users = $conn->fetchAll('SELECT * FROM users');
     
            $em = $this->get('doctrine.orm.entity_manager');
     
            $user = $em->find('TestBundle:User', $id);
     
     
            return $this->render('TestBundle:Test:base.html.twig', array('utilisateurs' => $user));
        }
    Que faut-il que je mette dans find?

    Voici l'erreur que j'obtient :

    Class Farid\TestBundle\Entity\User is not a valid entity or mapped super class.
    500 Internal Server Error - MappingException
    Merci par avance pour votre aide.

  2. #2
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Salut,

    Je pense que pour que Doctrine puisse correctement se servir de ton objet (entitee pour Doctrine), il faut que tu definisses ce qu'on appelle le mapping. Je pense que tu es sur cette page : http://symfony.com/doc/2.0/book/doct.../overview.html alors je te propose de suivre les annotations (ou via yaml comme tu veux) qui permettent de dire a Doctrine "ceci est l'id, sers toi en pour faire la recherche, etc", faire la correspondance tonobjet / doctrine quoi.
    Et ensuite n'oublie pas de creer la base et le schema correspondant via doctrine:database:create et doctrine:schema:create.
    C'est seulement ensuite que tu pourras utiliser le find de l'entity manager !

    Je debute autant que toi sur sf2, j'espere ne pas dire n'importe quoi ^^ Tiens moi au courant si ca marche (et encore plus si ca marche pas)

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 623
    Points : 1 370
    Points
    1 370
    Par défaut
    Citation Envoyé par winzou Voir le message
    Salut,

    Je pense que pour que Doctrine puisse correctement se servir de ton objet (entitee pour Doctrine), il faut que tu definisses ce qu'on appelle le mapping. Je pense que tu es sur cette page : http://symfony.com/doc/2.0/book/doct.../overview.html alors je te propose de suivre les annotations (ou via yaml comme tu veux) qui permettent de dire a Doctrine "ceci est l'id, sers toi en pour faire la recherche, etc", faire la correspondance tonobjet / doctrine quoi.
    Et ensuite n'oublie pas de creer la base et le schema correspondant via doctrine:database:create et doctrine:schema:create.
    C'est seulement ensuite que tu pourras utiliser le find de l'entity manager !

    Je debute autant que toi sur sf2, j'espere ne pas dire n'importe quoi ^^ Tiens moi au courant si ca marche (et encore plus si ca marche pas)
    Merci de ta réponse, je vais aller essayer ça.

    Autant les premières parties, je les ai pas trouvé trés détaillées, mais j'arrivé à m'en sortir, autant la partie sur le Model, ORM... je l'a trouve vraiment légère, j'aurai bien aimé un exemple complet de la création de la bdd jusqu'a l'affichage des données.
    Là il n'y a rien sur l'affichage, et je n'ai rien vue sur les requêtes multi-tables.

    Je relance un appel, si quelqu'un peut m'expliquer ce qu'est la différence entre DBAL et PDO et m'expliquer ce qu'est le mapping, le schéma...
    J'aime pas trop faire des manip sans comprendre ce que je fais et pourquoi je le fait.

    Merci.

  4. #4
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Symfony n'est pas doctrine, et de fait la doc Symfony ne documente pas Doctrine. Il faut se pencher soi meme sur http://www.doctrine-project.org si on veut comprendre. Il y en avait plus dans la doc sf1, notamment sur l'interaction avec sf (tout ce qui est form, validation, etc), je pense que ca viendra par la suite.

    Pour repondre a tes questions :

    DBAL (Doctrine Database Abstraction Layer) est une surcouche a PDO. Ca fait ce que son nom indique, a savoir rajouter une n-ieme couche d'abstraction pour vraiment se decoupler de ton choix de SGBDR. Pour faire simple : c'est un outil qui te permet de te connecter a ta base, et d'y faire des requetes, rien de plus !
    Ce qu'on appelle usuellement Doctrine comprend en fait BAL (interaction bdd) et ORM (gestion des objets et de leurs relations).

    Le mapping c'est un terme purement Doctrine, c'est le moyen de coupler ton object (ici ta classe User) a Doctrine. En effet Doctrine a besoin de connaitre les attributs de ton objet, leur type, les eventuelles relations avec d'autres objets (ce qui fera les requetes multitables), etc... Comme il ne peut pas le deviner, tu dois faire toi meme ce mapping. Tu peux le faire soi directement dans le code de ton objet via les "annotations", soit de facon plus classique (sf1) via un yaml ou xml.

    Le schema, d'apres ce que j'ai compris, c'est en quelque sorte la representation interne a Doctrine de ta base de donnees. C'est en fait la compilation de tous tes mappings. Pour creer effectivement tes tables dans ta base de donnees, tu dois d'abord compiler le schema, et ensuite "exporter" ce schema vers ta base de donnees (tu auras compris, le schema est independant de ton choix de bdd, l'export ne l'est pas).

    J'espere t'avoir un peu eclaire. Je sais qu'il fait noir pour l'instant, la lumiere viendra avec l'experience !

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2008
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 623
    Points : 1 370
    Points
    1 370
    Par défaut
    Citation Envoyé par winzou Voir le message
    J'espere t'avoir un peu eclaire. Je sais qu'il fait noir pour l'instant, la lumiere viendra avec l'experience !
    Tu m'a aidé oui, merci.

    Je vais reprendre mon apprentissage et suivre le cours sur le site de Doctrine.
    J'espere bientôt la voir cette lumière.

Discussions similaires

  1. Comment réaliser des modèles de documentations avec XML ?
    Par Dams76 dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 29/08/2003, 02h15
  2. Exportation des graphiques d'un modèle (Power AMC)
    Par boubaouz dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 16/04/2003, 15h59
  3. déposer modèle XML
    Par labyrinth dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 23/12/2002, 22h06
  4. A propos des modèles d'objet (avec sources)
    Par DevX dans le forum C++Builder
    Réponses: 14
    Dernier message: 01/12/2002, 12h22

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