我正在使用FOSUserBundle,我想在每个用户注册时默认禁用。管理员将通过电话联系每个用户,如果合适,他将使用户处于活动状态。我已经阅读了有关覆盖默认FOSUserBundle控制器但我无法弄清楚如何使其工作。我在src / AppBundle / Controller / RegistrationController.php中使用此方法创建了RegistrationController.php:
<?php
/*
* This file is part of the FOSUserBundle package.
*
* (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace FOS\UserBundle\Controller;
use Symfony\Component\DependencyInjection\ContainerAware;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Exception\AccountStatusException;
use FOS\UserBundle\Model\UserInterface;
/**
* Controller managing the registration
*
* @author Thibault Duplessis <[email protected]>
* @author Christophe Coevoet <[email protected]>
*/
class RegistrationController extends ContainerAware
{
/**
* Receive the confirmation token from user email provider, login the user
*/
public function confirmAction($token)
{
$user = $this->container->get('fos_user.user_manager')->findUserByConfirmationToken($token);
if (null === $user) {
throw new NotFoundHttpException(sprintf('The user with confirmation token "%s" does not exist', $token));
}
$user->setConfirmationToken(null);
$user->setEnabled(false);
$user->setLastLogin(new \DateTime());
$this->container->get('fos_user.user_manager')->updateUser($user);
$response = new RedirectResponse($this->container->get('router')->generate('fos_user_registration_confirmed'));
$this->authenticateUser($user, $response);
return $response;
}
}
,但没有任何作用,也许我需要有人向我展示如何做到这一点,仅此而已。
对于那些仍在努力解决这个问题的人,设置一个观察者来监听事件:fos_user.registration.initialize
这样(改编你的代码路径):
app.listener.disable_registered_user:
class: AppBundle\Observer\DisableRegisteredUserListener
arguments:
- "@templating"
tags:
# split to multiple line for readability
# can be made into a single line like - { name: ..., event: ... , method: ... }
-
name: "kernel.event_listener"
event: "fos_user.registration.initialize"
method: "disableUser"
那么这是您的事件监听器类的内容:
namespace AppBundle\Observer;
use FOS\UserBundle\Event\GetResponseUserEvent;
/**
* Class DisableRegisteredUserListener
* @package AppBundle\Observer
*/
class DisableRegisteredUserListener
{
/**
* @param \FOS\UserBundle\Event\GetResponseUserEvent $event
*/
public function disableUser(GetResponseUserEvent $event)
{
$user = $event->getUser();
/** @var \AppBundle\Entity\User $user */
$user->setEnabled(false);
}
}
你可以只听FOSUserEvents::REGISTRATION_CONFIRM
并再次禁用注册用户,然后再将其保存到数据库。
由于FOSUserBundle会自动将新用户转发到需要用户登录的confirmedAction
,因此您需要提供自己的响应来覆盖此用户。
你的听众......
class DisableRegisteredUserListener
{
/**
* @var EngineInterface
*/
private $templating;
/**
* @var EngineInterface $templating
*/
public function __construct(EngineInterface $templating)
{
$this->templating = $templating;
}
/**
* @var GetResponseUserEvent $event
* @return null
*/
public function disableUser(GetResponseUserEvent $event)
{
$user = $event->getUser();
$user->setEnabled(false);
$response = $this->templating->renderResponse(
'AppBundle:Registration:registration_complete.html.twig',
array(
'user' => $user,
)
);
}
}
您的服务文件(YAML)......
services:
app.listener.disable_registered_user:
class: AppBundle\EventListener\DisableRegisteredUserListener
arguments:
- "@templating"
tags:
# split to multiple line for readability
# can be made into a single line like - { name: ..., event: ... , method: ... }
-
name: "kernel.event_listener"
event: "fos_user.registration.confirm"
method: "disableUser"
然后,您的AppBundle:Registration:registration_complete.html.twig
可用于告诉新用户他们的帐户已创建但已禁用,然后您的团队成员会联系他们以完成此过程。