2010-05-01 4 views
1

Je veux faire en sorte que à tout moment le db est interrogé pour une sfGuardUserProfile il est autmoatically rejoint et hydratée avec son sfGuardUser connexe.sfDoctrineGuard - comment joindre TOUJOURS sfGuardProfile à sfGuardUser

Si j'utilisais Propel 1.2 i serait normalement remplacer la méthode doSelectStmt de la classe sfGuardUserProfilePeer pour inspecter le Criteria et le modifier si nécessaire, ainsi que la modification de la méthode hydrate de la classe sfGuardUserProfile. Je ne sais pas comment faire cela dans Doctrine.

+2

À chacun son. J'ai utilisé sfGuard depuis sa première écurie et ça marche pour moi. Je pense qu'il y a peut-être deux fois que cela n'a pas répondu à mes exigences et j'ai écrit quelque chose à partir de zéro pour le remplacer. – prodigitalson

Répondre

8

Vous pouvez utiliser des écouteurs d'événement. Lisez-en plus à leur sujet dans la documentation de doctrine:

Dans symfony 1.4, sfGuardUser peut être modifié. C'est par défaut dans lib/model/doctrine/sfDoctrineGuardPLugin/sfGuardUser.class.php. Vous pouvez ajouter la méthode preDqlSelect() suivante pour modifier la requête. Notez qu'il n'a pas été testé.

class sfGuardUser extends PluginsfGuardUser 
{ 
    public function preDqlSelect($event) 
    { 
    $params = $event->getParams(); 
    $query = $event->getQuery(); 
    $alias = $params['alias'] . '.Profile'; 
    if ((!$query->isSubquery() || ($query->isSubquery() && $query->contains(' ' .  $params['alias'] . ' '))) && !$query->contains($alias)) 
    { 
     $query->innerJoin($alias); 
    } 
    } 
} 

Pour que cela fonctionne, vous devez avoir les callbacks DQL activés. Vous pouvez le faire dans votre classe ProjectConfiguration:

class ProjectConfiguration extends sfProjectConfiguration 
    { 
    public function configureDoctrine(Doctrine_Manager $manager) 
    { 
     $manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, true); 
    } 
    } 
+0

Cela semble être ce que je cherchais ... Et bienvenue à Stack Overflow :-) – prodigitalson

+0

Le code que vous avez posté a fonctionné parfaitement. Merci! – prodigitalson

+0

Nice, réponse soignée :-) – richsage

1

Bien que je suis d'accord avec Coronatus, je pense que ce que vous cherchez à faire peut être réalisé avec:

http://www.symfony-project.org/plugins/sfGuardPlugin

Voir « Personnaliser le sfGuardUser modèle".

Fondamentalement, le profil doit être appelé « sf_guard_user_profile » et la relation mise en place, et vous devriez être en mesure d'utiliser:

$this->getUser()->getGuardUser()->getProfile(); 

Je pense que le bon nom de modèle de profil est nécessaire pour un fichier de configuration fins mais je peux me tromper.

+0

Eh bien, vous pouvez personnaliser le nom du modèle ... Et oui cela fonctionnera hors de la boîte pour récupérer le profil mais s'il n'est pas joint manuellement lorsque vous interrogez il émettra une requête séparée pour obtenir le profil object - im essayant de rendre la jointure automatique (désactivant essentiellement la charge paresseuse pour le modèle de profil et pas d'autres. – prodigitalson