我只是想在用户注册时做到这一点。他没有收到任何电子邮件。当然,我可以做到这一点:
registration:
confirmation:
enabled: false
然而,这会使用户自动注册而无需确认。
我想这样做,以便当用户注册时他必须等到管理员启用用户。这意味着我需要在默认情况下让用户被禁用..
我无法找到有关此事的任何信息。有人可以帮忙吗?
我尝试了这个,但它没有用:
user.php的
public function __construct()
{
parent::__construct();
// your own logic
$this->enabled = false;
//and
$this->setEnabled(false);
}
P.S与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(),
));
}
更新
我能做到这一点的唯一方法是启用电子邮件确认,但不向用户发送电子邮件。这样,用户无法确认其帐户,并且必须等到管理员启用它。但我不想有这样的问题。应该有办法正常禁用它们。
固定
我终于明白了。所有你必须在代码中的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');
}
}
答案 0 :(得分:2)
您可以尝试在用户实体中使用@ORM\HasLifecycleCallbacks()
,然后定义方法,例如:
/**
* @ORM\PrePersist
*/
public function yourMethod(){
$this->setEnabled(false);
}
这适合我。
答案 1 :(得分:1)
行$this->setEnabled = true;
应该是$this->setEnabled(true);
。
在任何情况下,我认为这不会起作用,因为\FOS\UserBundle\Controller\RegistrationController
行43
和114
明确地启用了用户:
$user->setEnabled(true);
因此我希望没有配置设置,因此您必须使用自己的逻辑覆盖RegistrationController
以将用户设置为禁用。
这非常简单,这是相关文档:
文档中还有一些关于使用事件挂钩到控制器的信息,这可能是一种可行的替代方法:
希望这会有所帮助:)