簡體   English   中英

Symfony2 FOSUserBundle禁用,電子郵件確認和用戶注冊

[英]Symfony2 FOSUserBundle disable both, email confirmation and user on registration

我只想在用戶注冊時做到這一點。 他沒有收到任何電子郵件。 當然,我可以做到這一點:

registration:
    confirmation:
        enabled: false 

然而,這使得用戶自動注冊而無需確認。

我想這樣做,以便當用戶注冊時他必須等到管理員啟用用戶。 這意味着我需要默認禁用用戶..

我找不到任何有關這方面的信息。 有人可以幫忙嗎?

我試過這個,但它沒有用:

user.php的

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

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

PS和FOS一起使用SonataUserBundle ..這是我的注冊動作:

 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

我能夠完成這項工作的唯一方法是啟用電子郵件確認,但不將電子郵件發送給用戶。 這樣,用戶無法確認其帳戶,並且必須等到管理員啟用它。 但我不想有這樣的問題..應該有一種方法來正常禁用它們。

固定

我終於弄明白了。 所有你必須在代碼中的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以將用戶設置為禁用。

這非常簡單,這是相關的文檔:

文檔中還有一些關於使用事件掛鈎到控制器的信息,這可能是一種可行的替代方法:

希望這可以幫助 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM