2010-07-02 22 views
3

Pouvons-nous avoir une classe de modèle singleton dans Doctrine?Singleton Models Doctrine

Pour les classes Singleton je devrais avoir un constructeur privé/protégé .... mais ce n'est pas possible que je tends une classe Doctrine qui a un constructeur public

Vous pouvez argumenter sur l'utilisation du motif Singleton lors de l'interaction avec la base de données, mais considérez simplement ce scénario:

J'ai un consignateur d'actions utilisateur qui se connecte à la base de données. Ce logger fait une certaine initialisation dans le constructeur (en obtenant les informations des utilisateurs en cours de la session) qui est commun pour toutes les instances du logger pour une exécution particulière.

Il semble qu'il n'y ait aucun moyen d'implémenter le modèle singleton pour les modèles lors de l'utilisation de Doctrine?

Répondre

7

Une instance d'une classe de modèle Doctrine correspond à une entité, par ex. une instance de User représente un utilisateur, et je doute que vous en ayez un seul. Mettez votre autre code dans une classe distincte, UserManager ou quelque chose.

class Logger { // plain old singleton class 

    function log(x) { 
     entry = new LogEntry(x); // LogEntry extends Doctrine_Model 
     entry.save(); 
    } 

} 
+0

Oui, je chercherais à stocker l'objet de données dans une classe séparée et à interagir avec lui de cette façon. – tsgrasser

+0

Je parle d'une classe logger qui enregistre les choses dans DB. le code d'initialisation pour cette classe est le même pour toutes les instances ....... ne fait-il pas l'affaire pour un singleton? – rahul

+0

Oui, mais ce ne devrait pas être un modèle Doctrine alors. Au lieu de cela, il utilisera une classe distincte LogEntry ou quelque chose qui est un tel modèle. –

1

Vous pouvez remplacer le constructeur public de telle sorte qu'il utilise une méthode de fabrique singleton qui créera une instance si elle n'existe pas encore ou extraira l'instance existante, puis retournera l'instance à l'appelant de la constructeur.

0

Votre problème ne réside pas dans la doctrine, il se trouve en PHP qui est apatride (oui il y a des méthodes comme l'état de stockage d'un objet). Par conséquent, vous ne pouvez jamais avoir plus d'un objet à la fois.

+0

Que faites-vous sujet? –