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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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