Symfony2 FOSUserBundle禁用两者,电子邮件确认和用户注册


Symfony2 FOSUserBundle disable both, email confirmation and user on registration

我只是想让它,当用户注册。他没有收到任何电子邮件。当然,我可以这样做:

registration:
    confirmation:
        enabled: false 

然而,这使得用户不需要确认就可以自动注册。

我想让它,当一个用户注册时,他必须等到管理员启用用户。这意味着我需要在默认情况下将用户设置为Disabled .

我找不到任何有关那方面的资料。有人能帮忙吗?

我试过了,但是没有成功:

User.php

  public function __construct()
{
    parent::__construct();
    // your own logic
        $this->enabled = false;
    //and
        $this->setEnabled(false);
    }

p。与FOS一起,我使用SonataUserBundle..这是我的registerAction:

 public function registerAction()
    {
        $user = $this->container->get('security.context')->getToken()->getUser();
        if ($user instanceof UserInterface) {
            $this->container->get('session')->getFlashBag()->set('sonata_user_error', 'sonata_user_already_authenticated');
            $url = $this->container->get('router')->generate('sonata_user_profile_show');
            return new RedirectResponse($url);
        }
        $form = $this->container->get('sonata.user.registration.form');
        $formHandler = $this->container->get('sonata.user.registration.form.handler');
        $confirmationEnabled = $this->container->getParameter('fos_user.registration.confirmation.enabled');
        $process = $formHandler->process($confirmationEnabled);
        if ($process) {
            $user = $form->getData();
            $authUser = false;
            if ($confirmationEnabled) {
                $this->container->get('session')->set('fos_user_send_confirmation_email/email', $user->getEmail());
                $url = $this->container->get('router')->generate('fos_user_registration_check_email');
            } else {
                $authUser = true;
                $route = $this->container->get('session')->get('sonata_basket_delivery_redirect');
                if (null !== $route) {
                    $this->container->get('session')->remove('sonata_basket_delivery_redirect');
                    $url = $this->container->get('router')->generate($route);
                } else {
                    $url = $this->container->get('session')->get('sonata_user_redirect_url');
                }
            }
            $this->setFlash('fos_user_success', 'registration.flash.user_created');
            $response = new RedirectResponse($url);
            if ($authUser) {
                $this->authenticateUser($user, $response);
            }
            return $response;
        }
        $this->container->get('session')->set('sonata_user_redirect_url', $this->container->get('request')->headers->get('referer'));
        return $this->container->get('templating')->renderResponse('MpShopBundle:Frontend:registration.html.'.$this->getEngine(), array(
            'form' => $form->createView(),
        ));
    }

我能做到这一点的唯一方法是启用电子邮件确认,但不发送电子邮件给用户。这样,用户就不能确认他的帐户,必须等到管理员启用它。但是我不想有这样的问题。应该有一种正常禁用它们的方法。

我终于想通了。你所要做的就是在代码中的registerAction中检查我是否需要电子邮件确认,在else语句中将其设置为启用并更新用户。如果你不更新它,它将无法工作。
if ($process) {
            $user = $form->getData();
            $authUser = false;
            if ($confirmationEnabled) {
                $this->container->get('session')->set('fos_user_send_confirmation_email/email', $user->getEmail());
                $url = $this->container->get('router')->generate('fos_user_registration_check_email');
            } else {
                $user->setEnabled(false);
                $userManager = $this->container->get('fos_user.user_manager');
                $userManager->updateUser($user);
                $route = $this->container->get('session')->get('sonata_basket_delivery_redirect');
                if (null !== $route) {
                    $this->container->get('session')->remove('sonata_basket_delivery_redirect');
                    $url = $this->container->get('router')->generate($route);
                } else {
                    $url = $this->container->get('session')->get('sonata_user_redirect_url');
                }
            }

你可以尝试在你的用户实体中使用@ORM'HasLifecycleCallbacks(),然后你定义一个方法,如:

/**
* @ORM'PrePersist
*/
public function yourMethod(){
    $this->setEnabled(false);
}

$this->setEnabled = true;应该是$this->setEnabled(true);

在任何情况下,我不认为这将工作,因为用户在43114'FOS'UserBundle'Controller'RegistrationController中显式地启用:

$user->setEnabled(true);

因此,我希望对此没有配置设置,因此您必须使用自己的逻辑重写RegistrationController以将用户设置为禁用。

这很简单,下面是相关的文档:

  • https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/overriding_controllers.md

文档中也有一些关于使用事件与控制器挂钩的信息,这可能是一种可行的替代方法:

  • https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/controller_events.md

希望这对你有帮助