Symfony FOSUserbundle -在帐户创建时设置角色的最佳实践(使用db查询)


Symfony FOSUserbundle - Best practice for setting role on account creation (with db query)

注册时,我想检查另一个表是否存在他们的用户名,如果存在,为该用户设置另一个角色。

我会在用户事件构造函数,侦听器,注册控制器中这样做吗?我尝试了其中的几个,但实际上有问题访问实体管理器查询表

当一个用户正在注册(或确认他们的电子邮件)时,我想要运行什么

    $em = $this->getDoctrine()->getEntityManager();
    $uniID = preg_replace('/'D/', '', $user->getUsername());
    if ($em->getRepository('AppBundle:User')->userHasMembership($uniID) == 1) {
        $user->addRole('ROLE_MEMBER');
    } else {
        $user->removeRole('ROLE_MEMBER');
    }
    $em->persist($user);
    $em->flush();

现在我已经将实体管理器注入到我的服务

app.registration_completed:
    class: UserBundle'EventListener'RegistrationConfirmListener
    arguments:
         - "@doctrine.orm.entity_manager"

我的事件监听器是下面的

类RegistrationConfirmListener实现EventSubscriberInterface{

protected $em;
function __construct(EntityManager $em)
{
    $this->em = $em;
}
public static function getSubscribedEvents()
{
    return array(
        FOSUserEvents::REGISTRATION_CONFIRM => 'onRegistrationConfirm'
    );
}
public function onRegistrationConfirm(GetResponseUserEvent $event)
{
    $user = $event->getUser();
    $uniID = preg_replace('/'D/', '', $user->getUsername());
    if ($this->em->getRepository('AppBundle:User')->userHasMembership($uniID) == 1) {
        $roles = array('ROLE_USER', 'ROLE_MEMBER');
    } else {
        $roles = array('ROLE_USER');
    }
    $user->setRoles($roles);
}

您已经发布了错误发生的问题。我建议您始终与您尝试过的代码共享错误,以便其他人能够解决问题。

请在下面尝试。只需在服务中传递doctrine对象参数,在__construct()中设置实体管理器。

services.yml

app.registration_completed:
    class: UserBundle'EventListener'RegistrationConfirmListener
    arguments:
         - "@doctrine"

RegistrationConfirmListener.php

class RegistrationConfirmListener implements EventSubscriberInterface {
    protected $em;
    function __construct(Doctrine $doctrine) // Get doctrine argument
    {
        $this->em = $doctrine->getEntityManager();
    }
    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::REGISTRATION_CONFIRM => 'onRegistrationConfirm'
        );
    }
    public function onRegistrationConfirm(GetResponseUserEvent $event)
    {
        $user = $event->getUser();
        $uniID = preg_replace('/'D/', '', $user->getUsername());
        if ($this->em->getRepository('AppBundle:User')->userHasMembership($uniID) == 1) {
            $roles = array('ROLE_USER', 'ROLE_MEMBER');
        } else {
            $roles = array('ROLE_USER');
        }
        $user->setRoles($roles);
    }
}

在Symfony 2.3中运行良好