2013-03-11 8 views
8

Sto costruendo il mio primo progetto Symfony2 serio. Sto estendendo FOSUserBundle per la gestione dei miei utenti/gruppi e vorrei che i nuovi utenti venissero aggiunti automaticamente a un gruppo predefinito. Credo che basta per estendere il costruttore entità utente in questo modo:Aggiunta di nuovi utenti FOSUserBundle a un gruppo predefinito alla creazione

/** 
* Constructor 
*/ 
public function __construct() 
{ 
    parent::__construct(); 
    $this->groups = new \Doctrine\Common\Collections\ArrayCollection(); 
    // Get $defaultGroup entity somehow ??? 
    ... 
    // Add that group entity to my new user : 
    $this->addGroup($defaultGroup); 
} 

Ma la mia domanda è: come faccio ad ottenere la mia entità DefaultGroup $, in primo luogo?

Ho provato a utilizzare il gestore di entità dall'entità, ma poi mi sono reso conto che era stupido e Symfony stava generando un errore. Ho cercato su google per questo, ma non ho trovato nessuna soluzione reale tranne forse setting up a service for that ... anche se questo mi sembra poco chiaro.

risposta

10

OK, ho iniziato a lavorare sull'implementazione dell'idea di artworkad.

La prima cosa che ho fatto è stato aggiornare FOSUserBundle a 2.0.*@dev in compositer.json, perché stavo usando v1.3.1, che non implementa la classe FOSUserEvents. Questo è necessario per iscriversi al mio evento di registrazione.

// composer.json 
"friendsofsymfony/user-bundle": "2.0.*@dev", 

poi ho aggiunto un nuovo servizio:

<!-- Moskito/Bundle/UserBundle/Resources/config/services.xml --> 
<service id="moskito_bundle_user.user_creation" class="Moskito\Bundle\UserBundle\EventListener\UserCreationListener"> 
    <tag name="kernel.event_subscriber" alias="moskito_user_creation_listener" /> 
     <argument type="service" id="doctrine.orm.entity_manager"/> 
</service> 

In XML, ho detto il servizio che mi serviva l'accesso a Dottrina attraverso un argomento doctrine.orm.entity_manager. Quindi, ho creato l'ascoltatore:

// Moskito/Bundle/UserBundle/EventListener/UserCreationListener.php 

<?php 
namespace Moskito\Bundle\UserBundle\EventListener; 

use FOS\UserBundle\FOSUserEvents; 
use FOS\UserBundle\Event\FormEvent; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Doctrine\ORM\EntityManager; 

/** 
* Listener responsible to change the redirection at the end of the password resetting 
*/ 
class UserCreationListener implements EventSubscriberInterface 
{ 
    protected $em; 
    protected $user; 

    public function __construct(EntityManager $em) 
    { 
     $this->em = $em; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    public static function getSubscribedEvents() 
    { 
     return array(
      FOSUserEvents::REGISTRATION_SUCCESS => 'onRegistrationSuccess', 
     ); 
    } 

    public function onRegistrationSuccess(FormEvent $event) 
    { 
     $this->user = $event->getForm()->getData(); 
     $group_name = 'my_default_group_name'; 
     $entity = $this->em->getRepository('MoskitoUserBundle:Group')->findOneByName($group_name); // You could do that by Id, too 
     $this->user->addGroup($entity); 
     $this->em->flush(); 

    } 
} 

E in fondo, è tutto!

Dopo ogni registrazione, viene chiamato onRegistrationSuccess(), quindi ottengo l'utente tramite lo FormEvent $event e lo aggiungo al gruppo predefinito, che ottengo tramite Doctrine.

3

Non hai detto come vengono creati i tuoi utenti. Quando alcuni amministratori creano gli utenti o hai un'azione di registrazione personalizzata, puoi impostare il gruppo nell'azione del controllore.

$user->addGroup($em->getRepository('...')->find($group_id)); 

Tuttavia, se si utilizza fosuserbundles costruire in registrazione è necessario collegare in controllori: https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/controller_events.md e utilizzare un listener di eventi.

+0

La seconda parte della risposta assomiglia a quello che voglio fare. Proverò a implementarlo e postare qui la risposta come soluzione. – Weengs

Problemi correlati