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

ORM PHP Discussion :

Constructeur dans une classe générée par Doctrine


Sujet :

ORM PHP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 16
    Par défaut Constructeur dans une classe générée par Doctrine
    Bonjour,

    J'ai une classe générée par Doctrine et qui extends une Base class.

    J'aimerai instancier cette class et lui passer des paramètre lors de l'instanciation (la langue par exemple)

    Je n'arrive pas à créer une méthode qui sert de constructeur et donc de pouvoir passer des paramètres globaux à toutes les méthode de ma classe une fois instanciée.

    J'aimerai éviter de devoir envoyer les même paramètre pour chaque fonction appelée, vu qu'ils ne changerons jamais dans ma classe.

    Voici la classe générée par doctrine que j'aimerai instancier(avec quelques paramètres)
    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
        <?php
     
        /**
        * This class has been auto-generated by the Doctrine ORM Framework
        */
        class BoardSections extends BaseBoardSections {
     
            public function ???($lang='fr'){
                $this->lang=$lang;
            }
     
            // get all sections
            public function getAllSections() {
                return Doctrine_Query::create()
                        ->select("si.section_id")
                        ->from("BoardSectionsInfo si")
                        ->innerJoin("si.BoardSections s")
                        ->where('si.section_lang = ?', $this->lang)
                        ->orderBy("s.section_order desc")
                        ->fetchArray();
            }
        }
    et voici comment j'aimerai pouvoir instancier cette classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        $board=new BoardSections($this->getUser()->getCulture());
    Connaissez vous un moyen pour y arriver?

    Merci d'avance

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    Je ne pense pas que les objets sfDoctrineRecord soient faits pour que l'on puisse surcharger leurs constructeurs.

    Par contre, lors de l'initialisation d'une instance, ton objet passe par les méthodes :
    - setTableDefinition ;
    - setUp(),
    dans lesquelles tu peux lui spécifier des valeurs par défaut (tu peux également le faire directement dans le schema.yml ; personnellement je le fais, mais certains ne le recommandent pas).

    Du coup, cela pourrait ressembler à quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class BoardSections
    {
      public fonction setUp()
      {
        parent::setUp();
        $this->setMyValue("defaultValue");
      }
    }
    ou bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class BoardSections
    {
      public fonction setTableDefinition()
      {
        parent::setTableDefinition();
        $this->setColumnOption('ma_colonne', 'default', 'defaultValue');
      }
    }
    Par contre, au lieu de passer une valeur au constructeur (je ne crois pas que ce soit faisable) pour initialiser la langue, j'aurais tendance à faire simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $culture = $this->getUser()->getCulture();
    $myBoardSections = new BoardSections();
    $myBoardSections->setCulture($culture);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 16
    Par défaut
    Merci pour l'info,

    Je pense que je vais me diriger vers ta 3ème proposition alors (une méthode setCulture), j'aurai juste préféré pouvoir le faire directement via le constructeur, mais soit.

    changer dans le schema je préfère pas vuq ue je risque de le regénérer assez fréquemment.

    merci en tout cas je vais tester ca.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    Ok très bien.

    Donc si je comprends bien, ton schema est généré directement depuis ta DB ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 16
    Par défaut
    oui c'est plus simple de créer mes tables et relation directement via mysql puis de générer le yml.

    J'en backup un de temps en temps au cas ou je devrais régénérer ma db

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    Si ce n'est qu'une question de simplicité, je te recommande de faire l'inverse dans ce cas.

    Les modèles générés par le doctrine:build-schema sont beaucoup plus verbeux et plus lourds à maintenir.

    Surtout, Doctrine t'offre beaucoup plus de possibilités (c'est un ORM et non seulement une BDR) que tes définitions de tables dans mySQL.
    Quid :
    - des Behaviors ;
    - des relations d'héritage entre tes objets ?

    Le fonctionnement :
    1. écrire son schema.yml
    2. générer la BD associée
    est le fonctionnement normal du couple Symfony / Doctrine.

    Faire l'inverse ne doit être imposé que par des contraintes fortes.

  7. #7
    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 : 62
    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
    Citation Envoyé par Lopimp Voir le message
    oui c'est plus simple de créer mes tables et relation directement via mysql puis de générer le yml.

    J'en backup un de temps en temps au cas ou je devrais régénérer ma db
    Je ne peux que soutenir Bilbonec.

    Le shema.yml est souvent vu comme une simple représentation de la base de données alors qu'il est le d'abord la description du modèle objet qui sera utilisé dans symfony. Un bon schéma.yml, c'est beaucoup de problèmes en moins.

    Penses y.

    Et n'hésite pas à mettre ton schéma ici si c'est le premier, une relecture peut être fructueuse, pour toi.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 16
    Par défaut
    Ok je saisi bien vos arguments, mais pour le moment je n'utilise aucune fonctionnalité qui n'est pas offerte par mySql.

    Ca changera p-e plus tard, mais pour l'instant, je ne suis qu'à la création de la structure de base de mon projet et générer l'yml automatiquement en fur et à mesure que je modifie ma base de donnée est très pratique pour moi.

    vous faites comment vous? Vous faite ca manuellement dans le fichier yml?
    Un peu rébarbatif quand même non?


    J'aurai néenmoins une question à ce sujet, car j'ai un petit problème qu'il faut que je résolve pour pouvoir vous afficher mon yml (et donc essayer de percer le mystème de mon erreur initialement posté ici )


    En fait comme je regénère mon yml avec la commande doctrine:build-schema, j'ai remarqué que j'avais des relation dupliquée maintes fois dans mon yml.

    ca me donne des trucs genre

    marelation
    marelation_2
    marelation_3
    marelation_4
    ...
    marelation_23

    je ne comprends pas d'ou viennent ces duplucation, j'ai supprimé mon yml, effacé mes classes Base générée par doctrine, clearé le cache,.... mais ces duplication reviennent inlassablement.

    je ne suis pas su rmon pc avec mes source actuellement donc je n'ai pas accès à mon yml, mais dites le moi si vous en avez besoin.

    merci d'avance

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    vous faites comment vous? Vous faite ca manuellement dans le fichier yml?
    Un peu rébarbatif quand même non?
    Personnellement, je suis bien content de pouvoir le faire maintenant en .yml : beaucoup plus léger, maintenable et moins contraignant que de le faire en SQL !! Et ayant lu ces derniers jours une partie de la documentation Doctrine, je peux t'assurer que cela peut vite se révéler très puissant.

    Sinon, concernant ta question :
    marelation
    marelation_2
    marelation_3
    marelation_4
    ...
    marelation_23

    je ne comprends pas d'ou viennent ces duplucation
    je pense que la raison est que, lorsque tu génères ton schema.yml depuis la DB, Doctrine interprète que tu as des clés étrangères entre tes tables (donc des relations), mais il ne sait pas quel nom donner à ces relations.

    D'où l'utilisation de noms génériques que tu as là.

    Par contre, cela n'empêche rien de fonctionner a priori ? Du coup ais-je bien compris ton problème ?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 16
    Par défaut
    j'ai l'impression qu'à chaque regénération de mon schema, de nouvelle duplications sont générées.

    (les relation que je crée via phpMyAdmin ont par défaut le nom du champs, donc elles ont toute un nom à la base)

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 396
    Par défaut
    j'ai l'impression qu'à chaque regénération de mon schema, de nouvelle duplications sont générées.
    Je viens de tester chez moi de générer plusieurs fois de suite mon schema.yml, et je n'ai pas ce comportement.

    Par contre, il convient de faire attention qu'une relation donnée est déclarée dans les deux sens (contrairement à un schema.yml classique).

    Donc désolé, je n'ai pas plus d'aide à apporter ...

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 16
    Par défaut
    OK merci, je posterai mon schema yml quand j'aurai accès à mon code comme tu me l'a demandé pour mon histoire de déclaration de variable dans ma classe doctrine.

    merci pour tes réponses en tout cas

  13. #13
    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 : 62
    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 l'outil MySql Workbench qui, équipé du plugin yaml arrive à générer un schéma potable.

    Mais il y a quelques subtilités importantes et qui peuvent rendre d'imminents services qu'il ne connait pas.

    Ne pas oublier que le shema gère autant, si pas plus le modèle objet que la base. Perso, je fais des dessins au crayon sur un papier (ben oui) ou avec MySql Workbench et j'écris le shema.yml à la main.

    Travailler de cette manière t'aurais déjà permis de gagner un temps certains.

Discussions similaires

  1. appeler une fonction dans une classe générée
    Par jeanmichmuch66 dans le forum C++Builder
    Réponses: 15
    Dernier message: 21/01/2009, 22h44
  2. pas de constructeur dans une classe
    Par womannosky dans le forum Langage
    Réponses: 2
    Dernier message: 24/06/2008, 10h16
  3. Réponses: 8
    Dernier message: 17/04/2007, 11h35
  4. [c#] Plusieurs constructeurs dans une classe
    Par Seth77 dans le forum C#
    Réponses: 3
    Dernier message: 04/09/2006, 12h28
  5. Réponses: 2
    Dernier message: 04/12/2005, 21h10

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