Php Symfony 3:FOSSUserBundle获取JsonResponse而不是重定向

Php Symfony 3:FOSSUserBundle获取JsonResponse而不是重定向,php,ajax,symfony,fosuserbundle,Php,Ajax,Symfony,Fosuserbundle,在我的synfony3项目中,我注意到在注册过程中会生成一些事件,我可以覆盖响应。不是呈现默认的细枝模板,而是重定向到只返回一个JsonResponse和一个successMessage 因此,我做了以下事件: namespace AppBundle\EventSubscriber; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use FOS\UserBundle\FOSUserEvents; use FOS\

在我的synfony3项目中,我注意到在注册过程中会生成一些事件,我可以覆盖响应。不是呈现默认的细枝模板,而是重定向到只返回一个JsonResponse和一个successMessage

因此,我做了以下事件:

namespace AppBundle\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
use AppBundle\Constants\AjaxJsonResponseConstants;
use Symfony\Component\HttpFoundation\JsonResponse;
use FOS\UserBundle\Event\FilterUserResponseEvent;

class UserRegistrationResponseChanger implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        $subscribedEvents=[
//              FOSUserEvents::REGISTRATION_INITIALIZE=>[],
                FOSUserEvents::REGISTRATION_COMPLETED=>[],
                FOSUserEvents::REGISTRATION_SUCCESS=>["setJsonResponseOnSuccess",-1],
                FOSUserEvents::REGISTRATION_FAILURE=>["setJsonResponseOnFailure",-1],
//              FOSUserEvents::REGISTRATION_CONFIRM=>[],
//              FOSUserEvents::REGISTRATION_CONFIRMED=>[]
        ];
    }

    public function setJsonResponseOnSuccess(FormEvent $formEvent)
    {
        $response=['status'=>AjaxJsonResponseConstants::AJAX_ACTION_SUCCESS,'message'=>"User Sucessfully Registered please check your mail."];
        $response=new JsonResponse($response);
        $formEvent->setResponse($response);

        return $response;
    }

    public function setJsonResponseOnFailure(FormEvent $formEvent)
    {
        $response=['status'=>AjaxJsonResponseConstants::AJAX_ACTION_FAIL,'message'=>"You cannot register please try again later"];
        $response=new JsonResponse($response);
        $formEvent->setResponse($response);

        return $response;
    }
}
在我的
services.yml
上,我还写了以下内容:

 app.user_register.subscriber:
  class: AppBundle\EventSubscriber\UserRegistrationResponseChanger
  tags:
   - { name: app.user_register.subscriber }
指挥部呢


以覆盖如何返回响应,但不知何故,它未能这样做,并重定向到默认页面。我试图实现的是通过ajax调用执行注册,而不是呈现注册页面和重定向

您应该执行以下步骤:

首先,在定义事件订阅服务器时,应使用
内核.event\u subscriber
而不是
app.user\u register.subscriber
,然后将订阅服务器定义为:

 app.user_register.subscriber:
  class: AppBundle\EventSubscriber\UserRegistrationResponseChanger
  tags:
   - { name: kernel.event_subscriber }
namespace AppBundle\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
use AppBundle\Constants\AjaxJsonResponseConstants;
use Symfony\Component\HttpFoundation\JsonResponse;
use FOS\UserBundle\Event\FilterUserResponseEvent;

class UserRegistrationResponseChanger implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        $subscribedEvents=[
//              FOSUserEvents::REGISTRATION_INITIALIZE=>[],
//              FOSUserEvents::REGISTRATION_COMPLETED=>[],
                FOSUserEvents::REGISTRATION_SUCCESS=>["setJsonResponseOnSuccess",-1],
                FOSUserEvents::REGISTRATION_FAILURE=>["setJsonResponseOnFailure",-1],
//              FOSUserEvents::REGISTRATION_CONFIRM=>[],
//              FOSUserEvents::REGISTRATION_CONFIRMED=>[]
        ];

        return $subscribedEvents;
    }

    public function setJsonResponseOnSuccess(FormEvent $formEvent)
    {
        $response=['status'=>AjaxJsonResponseConstants::AJAX_ACTION_SUCCESS,'message'=>"User Sucessfully Registered please check your mail."];
        $response=new JsonResponse($response);
        $formEvent->setResponse($response);

        return $response;
    }

    public function setJsonResponseOnFailure(FormEvent $formEvent)
    {
        $response=['status'=>AjaxJsonResponseConstants::AJAX_ACTION_FAIL,'message'=>"You cannot register please try again later"];
        $response=new JsonResponse($response);
        $formEvent->setResponse($response);

        return $response;
    }
}
转到
services.yml

此外,
getSubscribedEvents
必须返回侦听器数组。此外,完成的
FOSUserEvents::REGISTRATION\u
必须有一个侦听器,即使它没有实现,如果您不想让侦听器这样做,也必须有一个侦听器

最后,您的侦听器应该这样实现:

 app.user_register.subscriber:
  class: AppBundle\EventSubscriber\UserRegistrationResponseChanger
  tags:
   - { name: kernel.event_subscriber }
namespace AppBundle\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\FormEvent;
use AppBundle\Constants\AjaxJsonResponseConstants;
use Symfony\Component\HttpFoundation\JsonResponse;
use FOS\UserBundle\Event\FilterUserResponseEvent;

class UserRegistrationResponseChanger implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        $subscribedEvents=[
//              FOSUserEvents::REGISTRATION_INITIALIZE=>[],
//              FOSUserEvents::REGISTRATION_COMPLETED=>[],
                FOSUserEvents::REGISTRATION_SUCCESS=>["setJsonResponseOnSuccess",-1],
                FOSUserEvents::REGISTRATION_FAILURE=>["setJsonResponseOnFailure",-1],
//              FOSUserEvents::REGISTRATION_CONFIRM=>[],
//              FOSUserEvents::REGISTRATION_CONFIRMED=>[]
        ];

        return $subscribedEvents;
    }

    public function setJsonResponseOnSuccess(FormEvent $formEvent)
    {
        $response=['status'=>AjaxJsonResponseConstants::AJAX_ACTION_SUCCESS,'message'=>"User Sucessfully Registered please check your mail."];
        $response=new JsonResponse($response);
        $formEvent->setResponse($response);

        return $response;
    }

    public function setJsonResponseOnFailure(FormEvent $formEvent)
    {
        $response=['status'=>AjaxJsonResponseConstants::AJAX_ACTION_FAIL,'message'=>"You cannot register please try again later"];
        $response=new JsonResponse($response);
        $formEvent->setResponse($response);

        return $response;
    }
}

当您有注册确认(FOSUserBundle中的默认行为)时,您应该对
注册\u SUCCESS
事件进行优先级排序,请参阅

服务定义需要如下所示:

#app/config/services.yml
app.security_registration_success:
    class: Path\To\Your\EventListener\RegistrationSuccessListener
    tags:
        - { name: kernel.event_subscriber }
注册成功侦听器的示例:

<?php

declare(strict_types=1);

namespace Path\To\Your\EventListener;

use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\FOSUserEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;

class RegistrationSuccessListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [FOSUserEvents::REGISTRATION_SUCCESS => [['onRegistrationSuccess', -10]]];
    }

    public function onRegistrationSuccess(FormEvent $event): void
    {
        $event->setResponse(new JsonResponse());
    }
}

注册成功后,您将收到302重定向响应,否则将收到BADDREQUEST响应。如果在调用成功时不需要返回任何特定数据,那么只需等待Ajax调用中的302,并按照您需要的方式处理它,因为您可以假定它是成功的。如果你的注册错误监听器不工作,请告诉我,因此我将发布一个带有工作示例的答案。我需要返回Json,因为我想实现单页应用程序和所有“重定向”将通过Javascript而不是302重定向来完成。很高兴您能让它正常工作,但我相信实际的问题是,除了像您所说的那样标记为
kernel.event\u subscriber
之外,您还应该优先处理
REGISTRATION\u SUCCESS
事件。我添加了一个可能对其他人也有帮助的答案。我没有编辑,因为我不完全同意你的答案。它没有说明优先级和您所说的
注册完成
事件必须有一个侦听器是错误的。另外,请注意,您不需要返回响应。