8

我正在构建我的第一个严肃的 Symfony2 项目。我正在为我的用户/组管理扩展 FOSUserBundle,并且我希望将新用户自动添加到默认组中。我猜你只需要像这样扩展 User 实体构造函数:

/**
 * 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 抛出了一个错误。我搜索了这个,但没有找到真正的解决方案,除了可能为此设置服务......虽然这对我来说似乎很不清楚。

4

2 回答 2

10

好的,我开始着手实现artartad的想法。

我做的第一件事是在 composer.json 中将 FOSUserBundle 更新为 2.0.*@dev,因为我使用的是 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 doctrine.orm.entity_manager。然后,我创建了 Listener :

// 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并将其添加到我通过 Doctrine 获得的默认组中。

于 2013-03-12T04:19:25.593 回答
3

你没有说你的用户是如何创建的。当某些管理员创建用户或您有自定义注册操作时,您可以在控制器的操作中设置组。

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

但是,如果您在注册中使用 fosuserbundles,则必须连接到控制器:https ://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/controller_events.md并使用事件侦听器。

于 2013-03-11T08:38:53.377 回答