FOSUserBundle:如何允许注册、确认但不激活?

3
我希望用户能够注册,确认其电子邮件,但需要由管理员手动激活。
感谢this页面,我发现了FOSUserEvents :: REGISTRATION_CONFIRMED,它会在单击电子邮件中的确认链接后立即调用。
现在我想禁用该帐户(请参见下文)。
class RegistrationListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array(            
            FOSUserEvents::REGISTRATION_CONFIRMED => 'onRegistrationCompleted'
        );
    }

    public function onRegistrationCompleted(UserEvent $event) {
        // registration completed
        // TODO: disable the user. How?
    }
}

还是有我错过的配置吗?

有什么想法吗?

提前感谢!

1个回答

4

我看到,在FOS\UserBundle\Controller\RegistrationController::confirmAction()中,用户已启用:

/**
 * Receive the confirmation token from user email provider, login the user.
 *
 * @param Request $request
 * @param string  $token
 *
 * @return Response
 */
public function confirmAction(Request $request, $token)
{
    /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */
    $userManager = $this->get('fos_user.user_manager');

    ...

    $user->setConfirmationToken(null);
    $user->setEnabled(true);

    $event = new GetResponseUserEvent($user, $request);
    $dispatcher->dispatch(FOSUserEvents::REGISTRATION_CONFIRM, $event);

    $userManager->updateUser($user);
    ...

    $dispatcher->dispatch(FOSUserEvents::REGISTRATION_CONFIRMED, new FilterUserResponseEvent($user, $request, $response));

    return $response;
}

我能想到两个方法来禁用它。
1)编写事件监听器,对事件做出反应并禁用用户 => http://symfony.com/doc/master/bundles/FOSUserBundle/controller_events.html 2)重写 => https://symfony.com/doc/current/bundles/FOSUserBundle/overriding_controllers.html 我更喜欢第一种方法。
class RegistrationListener implements EventSubscriberInterface
{
    /** @var EntityManager */
    private $em;


    /**
     * @param EntityManager $em
     */
    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }

    public static function getSubscribedEvents()
    {
        return array(            
            FOSUserEvents::REGISTRATION_CONFIRMED => 'onRegistrationCompleted'
        );
    }

    public function onRegistrationCompleted(UserEvent $event) {
        // registration completed
        // TODO: disable the user. How?
        $user = $event->getUser();
        $user->setEnabled(false);

        $this->em->persist($user);
        $this->em->flush();
    }
}

你已经有了 $user,不需要使用 persist。只需要使用 flush 就可以了。 - Mert Öksüz
这正是我正在寻找的。谢谢! - Mr. B.
请使用 FilterUserResponseEvent $event 替代 UserEvent $event (使用 FOS\UserBundle\Event\FilterUserResponseEvent)。 - Sami

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接