2017-08-02 122 views
1

有关堆栈的问题很多,但说实话 - 没有人为我工作(我正在使用Symfony 3.3和FOSUserBundle 2.x)。注册后禁用用户,并允许管理员确认

我需要什么才达到:

  • 用户注册成功,在我的网页
  • 他的账户被自动设置为默认值(不发送电子邮件)
  • 管理员可以激活/启用该帐户从他管理面板

我已经创建了一个事件监听,但它不会工作..我甚至无法处理用户对象改变enabled状态...

#config.yml 
fos_user: 
    db_driver: orm # other valid values are 'mongodb' and 'couchdb' 
    firewall_name: main 
    user_class: AppBundle\Entity\User 
    from_email: 
     address: "%mailer_user%" 
     sender_name: "%mailer_user%" 
    registration: 
     form: 
      type: AppBundle\Form\RegistrationType 

和事件监听器:

class RegistrationListener implements EventSubscriberInterface 
{ 
    /** 
    * @var RouterInterface 
    */ 
    private $router; 

    private $em; 

    public function __construct(RouterInterface $route, UserManagerInterface $em) 
    { 
     $this->router = $route; 
     $this->em = $em; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    public static function getSubscribedEvents() 
    { 
     return array(
      FOSUserEvents::REGISTRATION_SUCCESS => 'onRegistrationSuccess', 
      FOSUserEvents::REGISTRATION_CONFIRMED=> ['onRegistrationConfirmed', 999], 
      FOSUserEvents::REGISTRATION_FAILURE => 'onRegistrationFailure' 
     ); 
    } 

    public function onRegistrationSuccess(FormEvent $event) 
    { 
     $url = $this->router->generate('app.registration.succes'); 
     $response = new JsonResponse(['redirectUrl' => $url]); 
     $event->setResponse($response); 
    } 

    public function onRegistrationFailure(FormEvent $event) 
    { 
     $array = array('success' => false, 'message' => (string)$event->getForm()->getErrors(true, true)); 
     $response = new JsonResponse($array, Response::HTTP_BAD_REQUEST); 
     $event->setResponse($response); 
    } 

    public function onRegistrationConfirmed(FilterUserResponseEvent $event) 
    { 
     /** 
     * this one is no working.. after registration account is enabled anyway... 
     */ 
     $user = $event->getUser(); 
     $user->setEnabled(false); 
     $user->setSalt('test'); 
     $this->em->updateUser($user); 
    } 
} 

回答

2

明白了!

只需拨打FOSUserEvents::REGISTRATION_SUCCESS即可,因为FOSUserEvents::REGISTRATION_CONFIRMED只有在用户点击他的电子邮件上的激活链接时才会触发,而我并未发送给他。

class RegistrationListener implements EventSubscriberInterface 
{ 
    /** 
    * @var RouterInterface 
    */ 
    private $router; 

    private $em; 

    public function __construct(RouterInterface $route, UserManagerInterface $em) 
    { 
     $this->router = $route; 
     $this->em = $em; 
    } 

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

    public function onRegistrationSuccess(FormEvent $event) 
    { 
     $user = $event->getForm()->getData(); 
     $user->setEnabled(false); 
     $this->em->updateUser($user); 

     $url = $this->router->generate('app.registration.succes'); 
     $response = new JsonResponse(['redirectUrl' => $url]); 
     $event->setResponse($response); 
    } 

    public function onRegistrationFailure(FormEvent $event) 
    { 
     $array = array('success' => false, 'message' => (string)$event->getForm()->getErrors(true, true)); 
     $response = new JsonResponse($array, Response::HTTP_BAD_REQUEST); 
     $event->setResponse($response); 
    } 
} 
相关问题