2017-08-27 4 views
1

Je suis en train d'apprendre Symfony et je crée mon propre UserBundle pour la raison que je dois utiliser une API en ligne pour gérer les utilisateurs. J'ai donc rejoint les objets User et Group avec la doctrine ManyToOne relation. Pour le moment tout fonctionne correctement. Symfony actualise l'objet Utilisateur sur chaque page et récupère l'identifiant du groupe (voir var_dump) mais je veux que Symfony récupère l'ensemble de l'objet Groupe sur chaque page et pas seulement l'identifiant de celui-ci.Demande d'objet de groupe avec l'utilisateur

User {#467 ▼ 
    -id: 104 
    -uuid: "~" 
    -username: "~" 
    -lastLogin: null 
    -websiteActivity: null 
    -clientToken: "1c667ad4-07e2-4ffa-8db1-9997eadbbc4b" 
    -accessToken: "b183f850ce4d4decb07cb7485c1d0a88" 
    -dataCheck: DateTime {#457 ▼ 
    +"date": "2017-08-27 18:23:31.000000" 
    +"timezone_type": 3 
    +"timezone": "Europe/Berlin" 
    } 
    -reputation: 0 
    -group: Group {#456 ▼ 
    +__isInitialized__: false 
    -id: 4 
    -inheritId: null 
    -name: null 
    -chatColor: null 
    -websiteName: null 
    -websiteColor: null 
    …2 
    } 
} 

Si vous savez comment faire cela Ce serait vraiment utile.

Merci beaucoup.

+0

Vous ne savez pas exactement ce que vous demandez - l'objet Utilisateur renvoie un objet Groupe comme prévu –

+0

Il ne renvoie pas l'objet entier, mais uniquement l'ID parce que Symfony n'obtient l'utilisateur que sur chaque page. L'objet Groupe ne doit pas être vide. –

+0

Remarquez comment il n'est pas initialisé - c'est parce que vous faites un 'var_dump()' de l'objet User sans aucune jointure à l'entité Group. Je parie que si vous faites 'var_dump ($ user-> getGroup() -> getName())' vous obtiendrez la valeur que vous attendez et ensuite le groupe sera initialisé, parce que Doctrine chargera alors cette entité avec une autre requête. Essentiellement, vous utilisez 'var_dump()' pour déboguer et ne pas comprendre le calque sous-jacent. En outre, utilisez 'dump()' à la place; il a été introduit dans Symfony 2.6 et est beaucoup mieux. –

Répondre

1

Gardez à l'esprit que $this->getUser() sur un contrôleur est un alias à ce qui suit:

$this->container->get('security.token_storage')->getToken()->getUser(); 

Vous pouvez jeter un oeil à Using a Custom Query to Load the User. Vous pouvez l'utiliser pour joindre automatiquement à votre entité du groupe:

public function loadUserByUsername($username) 
{ 
    return $this->createQueryBuilder('u') 
     ->select('u, g') 
     ->leftJoin('u.group', 'g') 
     ->where('u.username = :username OR u.email = :email') 
     ->setParameter('username', $username) 
     ->setParameter('email', $username) 
     ->getQuery() 
     ->getOneOrNullResult(); 
} 

C'était previously documented dans les versions Symfony < = 2,5, mais était removed from the documentation pour plus de clarté et potentiellement parce qu'il n'a pas été nécessaire pour la plupart des cas. Si vous le souhaitez, vous pouvez également le déplacer vers votre UserRepository (s'il existe) et l'appeler à partir de là.

Ceci prend effet lorsque l'utilisateur se connecte. Essayez-le pour voir si votre objet Groupe sera automatiquement récupéré.

+1

Exactement ce que je cherchais! Merci beaucoup! –

+0

Est-il possible de charger l'utilisateur par cette fonction avec l'ID au lieu du nom d'utilisateur? –

+0

Eh bien, la fonction dit 'loadUserByUsername()' et a généralement lieu lorsque l'utilisateur se connecte par son adresse e-mail ou son nom d'utilisateur, mais il n'y a aucune raison de ne pas passer l'ID à cette fonction -> où ('u.id =: id) -> setParameter (' id ', $ username); ' –