Php 向FOSUserBundle注册用户而不登录用户

Php 向FOSUserBundle注册用户而不登录用户,php,symfony,fosuserbundle,Php,Symfony,Fosuserbundle,我正在尝试使用FOSUserBundle实现注册。我希望管理员能够注册一个新用户,我只需将注册更改为防火墙路由(/admin/register prefix) 我创建了一个自定义注册表单类型,并按照以下说明将其注册为服务: 然后,我根据以下内容连接到注册事件: 我的听众是这样的: use FOS\UserBundle\FOSUserEvents; use FOS\UserBundle\Event\FilterUserResponseEvent; use Symfony\Component\Eve

我正在尝试使用FOSUserBundle实现注册。我希望管理员能够注册一个新用户,我只需将注册更改为防火墙路由(/admin/register prefix)

我创建了一个自定义注册表单类型,并按照以下说明将其注册为服务:

然后,我根据以下内容连接到注册事件:

我的听众是这样的:

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;


class RegistrationListener implements EventSubscriberInterface
{
    private $router;

    public function __construct(UrlGeneratorInterface $router)
    {
        $this->router = $router;
    }

    /**
     * {@inheritDoc}
     */
    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::REGISTRATION_COMPLETED => 'onRegisterDone',
            FOSUserEvents::REGISTRATION_CONFIRMED => 'onRegisterDone',
            FOSUserEvents::RESETTING_RESET_COMPLETED => 'onRegisterDone',
        );
    }

    public function onRegisterDone(FilterUserResponseEvent $event)
    {
        $url = $this->router->generate('admin_panel');

        //$event->setResponse(new RedirectResponse($url));
    }
}
FilterUserResponseEvent没有setResponse方法,所以我只是让它运行。我认为订阅此事件将覆盖默认的FOS\UserBundle\EventListener\AuthenticationListener订阅事件,并阻止用户登录,但新用户仍会登录


是否可以阻止身份验证,或者我只是创建一个新表单来调用调用用户管理器的操作?

您也可以覆盖注册控制器来执行此操作。()

您只需要删除一行
$this->authenticateUser($user)和用户在注册后将不会进行身份验证


重写控制器以仅删除此行不是一个好方法。但是,如果您无法覆盖正确的侦听器并在正确的时刻挂接,那么这可能是尽快完成任务的最简单方法;-)

也有同样的问题,这对我来说很有效

注释掉覆盖的注册控制器中的此行:

$dispatcher->dispatch(FOSUserEvents::注册完成,新过滤器响应事件($user,$request,$response))


在不覆盖整个控制器的情况下,这里有一个更干净的版本:

是的,我知道注射整个容器是不好的做法,但这是一个快速的解决方案b

class RegistrationListener implements EventSubscriberInterface
{

protected $container;

public function __construct(ContainerInterface $container)
{
    $this->container = $container;
}

    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::REGISTRATION_CONFIRMED => ['onRegistrationConfirm', 999],
        );
    }

    public function onRegistrationConfirm(FilterUserResponseEvent $filterUserResponseEvent){
        $user = $filterUserResponseEvent->getUser();
        $user_manager = $this->container->get('fos_user.user_manager');
$user->setEnabled(false);
        $user->setLocked(true);
        $user_manager->updateUser($user);

    }


}

这就是我重定向到管理面板所做的。我使用了REGISTRATION_SUCCESS事件(它使用FormEvent而不是FilterUserResponseEvent)

为了防止身份验证,我必须重写AuthenticationListener,如中所述。这是我的AuthenticationListener:

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\EventListener\AuthenticationListener as FOSAuthenticationListener;

class AuthenticationListener extends FOSAuthenticationListener
{
    public static function getSubscribedEvents()
    {
        return array(
            // do not authenticate after registration
            // FOSUserEvents::REGISTRATION_COMPLETED => 'authenticate',
            // FOSUserEvents::REGISTRATION_CONFIRMED => 'authenticate'
            FOSUserEvents::RESETTING_RESET_COMPLETED => 'authenticate',
        );
    }
}

做一个简单的表单(重复使用现有的注册表单类型),它只使用用户管理器。也许在某个时候,我会遇到如何禁用默认功能。是的,我认为这可能是一个解决方案,但我不认为当我部署到其他地方并使用composer重新下载包时,这将是一个可持续的选择。感谢分享。我已经走了另一条路,但如果我重新考虑这个问题,我可能会这样做。在再次查看这里的回复后,我注意到我第一次误解了Michael的答案。
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;


class RegistrationListener implements EventSubscriberInterface
{
    private $router;

    public function __construct(UrlGeneratorInterface $router)
    {
        $this->router = $router;
    }

    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::REGISTRATION_SUCCESS => 'onRegistrationSuccess',
        );
    }

    public function onRegistrationSuccess(FormEvent $event)
    {
        $url = $this->router->generate('admin_users');
        $event->setResponse(new RedirectResponse($url));
    }
}
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\EventListener\AuthenticationListener as FOSAuthenticationListener;

class AuthenticationListener extends FOSAuthenticationListener
{
    public static function getSubscribedEvents()
    {
        return array(
            // do not authenticate after registration
            // FOSUserEvents::REGISTRATION_COMPLETED => 'authenticate',
            // FOSUserEvents::REGISTRATION_CONFIRMED => 'authenticate'
            FOSUserEvents::RESETTING_RESET_COMPLETED => 'authenticate',
        );
    }
}