2016-11-09 36 views
1

注册时,我想检查另一个表,如果他们的用户名存在,并且如果有,请为该用户设置另一个角色。Symfony FOSUserbundle - 创建帐户角色的最佳实践(使用db查询)

我会在用户事件构造函数,监听器,注册控制器中执行此操作吗?我尝试了这些,但有问题的实际访问实体管理器来查询表

那么我现在想运行(的地方),当用户正在注册(或确认他们的电子邮件)

$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 IM补充(9.3)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); 
} 
+0

我可能会做它在登记控制器(除非有是用户可以注册的其他地方吗?)。你对EntityManager有什么样的麻烦? – Rhono

+0

就像这个例子? http://symfony.com/doc/current/bundles/FOSUserBundle/overriding_controllers.html – p3tch

回答

0

您已经发布了错误发生的问题。我建议你总是与你尝试过的代码分享错误,以便其他人可以顺应解决问题。

请在下面尝试。 只需在服务中传递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

+0

是的,它的作品,我想知道什么是最好的做法是 – p3tch