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 :

Les entités (tables) sous Symfony 2


Sujet :

Symfony PHP

  1. #41
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    195
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 195
    Par défaut
    Citation Envoyé par RapotOR Voir le message
    exact, il suffit de mettre un dossier "Command" avec des fonctions personnelles.
    cela contourne le probleme: le seul ennui est que ca allonge la liste... dommage...
    Pour personnaliser nos commandes et donc mettre que les fonctions que l'on désire il suffit de créer une class héritant de Symfony\Component\Console\Application et de l'utiliser dans le fichier console => regarder comment est fait la class Symfony\Bundle\FrameworkBundle\Console\Application. ( C'est une des puissances de symfony2 c'est que tout est personnalisable )

  2. #42
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Il y a un changement important dans la génération des entités entre la PR6 et la PR7. Je suis tombé (de haut) dessus un peu par hasard lors d'une recherche de solution pour un autre problème. Je vous copie ici mes réflexions sur ces modifications.

    Depuis la PR7 la méthode de génération des entities depuis des fichiers annotation a changé dans Symfony2 (pas vérifié dans doctrine, pas non plus fait d'introspection pour savoir où la modification à été faîte).

    Avant on créait une classe du nom de l'entité à générer. Puis on appliquait un "doctrine:generate:entities "XxxxxxBundle"" pour générer les geter dans la classe.

    Maintenant, ceci n'est plus possible. A priori (je n'ai pas tout testé mais je pense ne pas être trop à côté) il y a deux approches.

    Approche "pure et dure". Écriture intégral de la classe de l'entity ce qui permet de faire ce que l'on veut (mais les getters sont à ce payer à la main).

    Approche "plutôt douce". Il faut passer par la création d'un fichier "~MonEntity.php" et y définir les propriétés de l'objet à générer et les annotations qui vont avec. Aucun code de geter. Ensuite la commande "doctrine:generate:entities " permet de créer les MonEntity.php qui correspondent avec les geter qui vont bien. En fait, cette méthode ressemble furieusement à la méthode par un fichier yml.

    Ce qui me pose un problème de structure des objets. Vu que la deuxième méthode me semble plus appropriées mais qu'elle ne permet pas de faire des geter particulier notamment pour des champs de style (et pas de type) enum. Et les classe particulière pour la gestion des droits.

    Il manque un niveau d'objet entre la classe de base auto générée et la classe utilisée. Un peu comme dans symfony 1 avec les classes BaseXxxx et la classe utilisée Xxxx.

    A voir si la classe repository peut être utilisée dans cet optique ?

    A voir comment il est maintenant possible de créer des classes entity elle même fille de...
    Ceci remet partiellement en cause ma manière d'envisager le développement accès aux données.

    Il va falloir repartir dans de nouveaux essais.

    D'une manière étonnante, ceci n'est repris dans aucune documentation, ni sur Symfony2, ni sur Doctrine 2. Les informations ici sont donc uniquement issues des essais et "décompilation" d'une partie du code de Symfony2.

  3. #43
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Par défaut
    la doc a regarder est definitivement celle de doctrine2.

    je teste ce soir.

  4. #44
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Sauf que la doc de doctrine n'en touche pas un mot et que mon sentiment est que c'est dans l'intégration de doctrine à symfony que cela ce joue. Mais j'ai des doutes sur mon sentiment

  5. #45
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut
    Bonjour,

    je viens de prendre la discussion car il se trouve que j'ai le même genre de souci.

    J'ai créé un fichier doctrine.orm.yml dans src/application/bundleName/Resources/config/doctrine.

    J'essaie ensuite la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php app/console doctrine:generate:entities ApplicationBundleName
    Et là j'obtiens ce message :

    [RuntimeException]
    Bundle ApplicationBundleName does not contain any mapped entities.
    Quelqu'un a-t-il déjà réussi ce genre d'opération et si oui comment ?

    Merci d'avance

  6. #46
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    De façon générale la commande generate:entities est un peu useless :
    - c'est facile de faire l'entité à la main
    - une fois qu'elle est faite tu vas y rajouter ton propre code, et si tu veux regenerer ? Conflit.

    Ceci dit, montre nous la section doctrine de ton app/config.yml et ton doctrine.orm.yml (nom bizarre d'ailleurs, ca devrait être nom_entite.orm.yml, tu as vraiment une entité qui s'appelle doctrine ?).

  7. #47
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 778
    Par défaut
    Citation Envoyé par winzou Voir le message
    nom bizarre d'ailleurs, ca devrait être nom_entite.orm.yml, tu as vraiment une entité qui s'appelle doctrine ?
    Ce n'est pas si bizarre, c'est juste un fichier qui contient toutes les entités (comme un bon vieux schema.yml dans sf1).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  8. #48
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut
    Citation Envoyé par winzou Voir le message
    De façon générale la commande generate:entities est un peu useless :
    - c'est facile de faire l'entité à la main
    - une fois qu'elle est faite tu vas y rajouter ton propre code, et si tu veux regenerer ? Conflit.
    OK, tu veux dire écrire la classe en php avec les annotations ? ça j'ai fait tout à l'heure mais j'ai généré ensuite avec la fameuse commande. Ca s'est bien passé : ça a généré des getters/setters... par contre j'ai fait une modif dans un fichier de classe et la commande passait plus. Mais c'est peut être normal et que les modifs sont quand même prises en compte.

    Malheureusement je n'ai pas pu vérifier. Je m'attendais à ce que les tables soient générées dans la base mais non... Ce serait bien d'avoir une petite procédure à suivre pour finaliser la mise en place du projet avec la connexion à la base...

    Je mettrai mes sources demain parce que là je ne suis pas chez moi...

  9. #49
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2009
    Messages : 91
    Par défaut
    Quelqu'un a-t-il déjà réussi ce genre d'opération et si oui comment ?
    Oui ! Tu peux nous mettre le code de ton fichier yaml, php, xml pour vérifier. En général le problème vient de là.

    Perso j'éviterais d'appeler une entité Doctrine, c'est se jeter dans le feu

  10. #50
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Citation Envoyé par dourouc05 Voir le message
    Ce n'est pas si bizarre, c'est juste un fichier qui contient toutes les entités (comme un bon vieux schema.yml dans sf1).
    Je crois qu'on doit faire 1 fichier / entité avec Doctrine2. Et le nom du fichier correspond au nom de l'entité. Si tu as mis plusieurs entités dans le même fichier ca vient peut-être de là ?

    Sinon oui perso j'utilise annotation + je fais mes propres getter/setter (parce que ca prend 5sec alors qu'il en faut 10 pour passer la commande).

    Et pour créer les tables dans la base, c'est doctrine:schema:create

  11. #51
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 778
    Par défaut
    Citation Envoyé par winzou Voir le message
    Je crois qu'on doit faire 1 fichier / entité avec Doctrine2. Et le nom du fichier correspond au nom de l'entité. Si tu as mis plusieurs entités dans le même fichier ca vient peut-être de là ?
    Ce n'est pas ton métier de croire :

    Citation Envoyé par http://symfony.com/doc/current/book/doctrine/orm.html
    Instead of creating one file per entity, you can also define all your mapping information into a single doctrine.orm.yml file.
    Testé chez moi, ça fonctionne (enfin, ça a fonctionné, vu que je suis passé aux annotations).
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  12. #52
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2009
    Messages : 91
    Par défaut
    Oui cela fonctionne, on peut créer un schema complet ou un fichier par entité.

    Cependant l'erreur qu'il rencontre est commune à une mauvaise définition de namespace dans le schema (par exemple un \ à la déclaration alors qu'il n'en faut pas) ou il n'a pas rajouté l'information de mapping dans le fichier config.yml bien que maintenant ce n'est plus vraiment nécessaire vu que c'est en auto_mapping par défaut (tout dépend quand il a téléchargé sa version de sf2)

  13. #53
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Par défaut
    Pour ma défense ca n'a pas toujours été le cas (enfin... je crois :p)

  14. #54
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut
    Bon voici les codes :

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    Ns\Smith2Bundle\Entity\Client:
     type:    entity
     table:   sf_client
     id:
       id:
         type:  integer
         generator:
           strategy: auto
     fields:
       nom:
         type: string(75)
         notnull: true
       adresse1:
         type: string(255)
         notnull: true
       adresse2:
         type: string(255)
       cp:
         type: string(5)
         notnull: true
       ville:
         type: string(50)
         notnull: true
       pays:
         type: string(255)
         notnull: true
         default: "France"
       siret:
         type: string(14)
     
    Ns\Smith2Bundle\Entity\Contact:
     type:    entity
     table:   sf_contact
     id:
       id:
         type:  integer
         generator:
           strategy: auto
     fields:
      civilite:
       type: enum
       length: 3
       values: ['M.','Mme','Melle']
      nom: { type: string(255), notnull: true }
      prenom: { type: string(255), notnull: true }
      fonction: { type: string(255) }
      tel: { type: string(255) }
      gsm: { type: string(255) }
      fax: { type: string(255) }
      courriel: { type: string(255) }
     oneToOne:
      client:
        targetEntity: Client
        join_column:
          name: client_id
          referencedColumnName: id
     
    Ns\Smith2Bundle\Entity\Facture:
     type:    entity
     table:   sf_Facture
     id:
       id:
         type:  integer
         generator:
           strategy: auto
     fields:
      numero: { type: integer, notnull: true }
      prestation: { type: string(255), notnull: true }
      echeance: { type: date, notnull: true }
      devis: { type: boolean, notnull: true, default: true }
      payee: { type: date }
     oneToOne:
      client:
        targetEntity: Client
        join_column:
          name: client_id
          referencedColumnName: id
     
    Ns\Smith2Bundle\Entity\Entree:
     type:    entity
     table:   sf_entree
     id:
       id:
         type:  integer
         generator:
           strategy: auto
     fields:
      designation: { type: string(255), notnull: true }
      montant_ht:
       type: decimal(6)
       scale: 2
       notnull: true
     oneToOne:
      client:
        targetEntity: Facture
        join_column:
          name: facture_id
          referencedColumnName: id
    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
    doctrine:
        dbal:
            default_connection: default
            connections:
              default:
                driver:   %database_driver%
                host:     %database_host%
                dbname:   %database_name%
                user:     %database_user%
                password: %database_password%
     
        orm:
            auto_generate_proxy_classes: %kernel.debug%
            default_entity_manager: default
            auto_mapping: true
    Chemin vers le fichier du schéma : /src/Ns/Smith2Bundle/Resources/config/doctrine/doctrine.orm.yml

    Donc c'est là que je lance la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    doctrine:generate:entities NsSmith2Bundle
    et que j'obtiens une RuntimeException :
    [RuntimeException]
    Bundle NsSmith2Bundle does not contain any mapped entities.

  15. #55
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2009
    Messages : 91
    Par défaut
    Bundle InteracticeSmith2Bundle
    bizarre, il vient d'où ce Interactice ?? Qu'as-tu mis comme namespace dans AppKernel.php et autoload.php ?

    Edit: Bon ben si tu changes ton message d'erreur mon post n'est plus valable

  16. #56
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 155
    Par défaut
    Citation Envoyé par creativecwx Voir le message
    bizarre, il vient d'où ce Interactice ?? Qu'as-tu mis comme namespace dans AppKernel.php et autoload.php ?
    Oups, j'ai oublié de changer celui-là ...

    AppKernel.php
    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
    <?php
     
    use Symfony\Component\HttpKernel\Kernel;
    use Symfony\Component\Config\Loader\LoaderInterface;
     
    class AppKernel extends Kernel
    {
        public function registerBundles()
        {
            $bundles = array(
                new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
                new Symfony\Bundle\SecurityBundle\SecurityBundle(),
                new Symfony\Bundle\TwigBundle\TwigBundle(),
                new Symfony\Bundle\MonologBundle\MonologBundle(),
                new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
                new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
                new Symfony\Bundle\AsseticBundle\AsseticBundle(),
                new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
                new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
    	    new \Ns\Smith2Bundle\NsSmith2Bundle()
            );
     
            if (in_array($this->getEnvironment(), array('dev', 'test'))) {
                $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
                $bundles[] = new Symfony\Bundle\WebConfiguratorBundle\SymfonyWebConfiguratorBundle();
            }
     
            return $bundles;
        }
     
        public function registerContainerConfiguration(LoaderInterface $loader)
        {
            $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml');
        }
    }
    Autoload.php :
    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
    <?php
     
    use Symfony\Component\ClassLoader\UniversalClassLoader;
     
    $loader = new UniversalClassLoader();
    $loader->registerNamespaces(array(
        'Symfony'          => array(__DIR__.'/../vendor/symfony/src', __DIR__.'/../vendor/bundles'),
        'Sensio'           => __DIR__.'/../vendor/bundles',
        'JMS'              => __DIR__.'/../vendor/bundles',
        'Doctrine\\Common' => __DIR__.'/../vendor/doctrine-common/lib',
        'Doctrine\\DBAL'   => __DIR__.'/../vendor/doctrine-dbal/lib',
        'Doctrine'         => __DIR__.'/../vendor/doctrine/lib',
        'Monolog'          => __DIR__.'/../vendor/monolog/src',
        'Assetic'          => __DIR__.'/../vendor/assetic/src',
        'Ns'      => __DIR__.'/../src'
    ));
    $loader->registerPrefixes(array(
        'Twig_Extensions_' => __DIR__.'/../vendor/twig-extensions/lib',
        'Twig_'            => __DIR__.'/../vendor/twig/lib',
        'Swift_'           => __DIR__.'/../vendor/swiftmailer/lib/classes',
    ));
    $loader->register();
    $loader->registerPrefixFallback(array(
        __DIR__.'/../vendor/symfony/src/Symfony/Component/Locale/Resources/stubs',
    ));

Discussions similaires

  1. problème de bordure avec les tables sous IE
    Par Silvia12 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 28/09/2007, 11h45
  2. Réponses: 2
    Dernier message: 23/07/2007, 15h12
  3. Réponses: 18
    Dernier message: 11/07/2007, 18h38
  4. Réponses: 5
    Dernier message: 10/07/2007, 10h43
  5. pb sur les tables sous oracle
    Par pepsister dans le forum Administration
    Réponses: 6
    Dernier message: 09/11/2006, 22h56

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