2015-07-13 79 views
4

我只是想让用户注册。他没有收到任何电子邮件。当然我可以这样做:Symfony2 FOSUserBundle在注册时同时禁用了邮件确认和用户

registration: 
    confirmation: 
     enabled: false 

但是,这使得用户自动注册没有确认。

我想这样做,当用户注册时,他必须等待,直到管理员启用用户。这意味着我需要使用户在默认情况下被禁用..

我无法找到任何有关信息。有人可以帮忙吗?

我试过,但它没有工作:

user.php的

public function __construct() 
{ 
    parent::__construct(); 
    // your own logic 

     $this->enabled = false; 
    //and 
     $this->setEnabled(false); 
    } 

PS加上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(), 
     )); 
    } 

UPDATE

I ca ñ使这项工作是通过启用电子邮件确认,但不发送电子邮件给用户。这样用户不能确认他的账户,并且必须等待管理员启用它。但我不想有这样的问题..应该有办法通常禁用它们。

FIXED

我终于想通了。你所要做的只是在代码中的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'); 
       } 
      } 

回答

1

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

在任何情况下,我不认为这会工作,因为用户在\FOS\UserBundle\Controller\RegistrationController启用上线43114显式:

$user->setEnabled(true); 

因此我预计,没有配置设置,这一点,因此您必须用您自己的逻辑覆盖RegistrationController以将用户设置为禁用。

这是非常简单的,这里的相关文件:

还有关于使用事件挂钩到控制器的文档中的一些信息,这可能是一个可行的替代办法:

希望这有助于:)

+0

嘿谢谢你的回复。不幸的是我已经试过了。我忘了提及我也在使用SonataUserBundle。我已经使用registrationAction更新了我的答案。看看它。 – Dominykas55

+0

啊......好吧,我从来没有使用过'SonataUserBundle',所以我不确定在这种情况下问题是什么。对于那个很抱歉。 –

2

您可以尝试在用户使用实体然后@ORM\HasLifecycleCallbacks()定义的方法,如:

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

这对我的作品。

相关问题