2013-03-11 2 views
8

Я строю свой первый серьезный проект Symfony2. Я расширяю FOSUserBundle для моего управления пользователями/группами, и я хотел бы, чтобы новые пользователи автоматически добавлялись к группе по умолчанию. Я думаю, вы просто должны расширить лицо конструктор пользователя, как это:Добавление новых пользователей FOSUserBundle к группе по умолчанию при создании

/** 
* 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); 
} 

Но мой вопрос, как я могу получить свой $ defaultGroup объект в первую очередь?

Я попытался использовать диспетчер сущности изнутри объекта, но потом понял, что это глупо, и Symfony выдала ошибку. Я искал это для Google, но не нашел реального решения, кроме, может быть, setting up a service for that ... хотя это кажется мне неясным.

ответ

10

ОК, я начал работать над реализацией идеи artworkad.

Первое, что я сделал, это обновление FOSUserBundle до 2.0.*@dev в composer.json, потому что я использовал v1.3.1, который не реализует класс FOSUserEvents. Это необходимо для подписания моего регистрационного события.

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

Затем я добавил новую услугу:

<!-- 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> 

В XML, я сказал службу мне нужен доступ к Доктрине через аргумент doctrine.orm.entity_manager. Затем я создал слушателя:

// 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(); 

    } 
} 

И в основном, все!

После каждого успеха регистрации вызывается onRegistrationSuccess(), поэтому я получаю пользователя через FormEvent $event и добавляю его в свою группу по умолчанию, которую я получаю через Доктрину.

3

Вы не сказали, как ваши пользователи создаются. Когда какой-либо администратор создает пользователей или у вас есть пользовательское действие регистрации, вы можете установить группу в действии контроллера.

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

Однако, если вы используете fosuserbundles встраивать регистрации вы должны подключить в контроллеры: https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/controller_events.md и использовать слушатель событий.

+0

Вторая часть вашего ответа выглядит так, как я хочу. Я попытаюсь реализовать его и разместить здесь ответ в качестве решения. – Weengs

Смежные вопросы