Php Symfony 3:FOSSUserBundle获取JsonResponse而不是重定向
在我的synfony3项目中,我注意到在注册过程中会生成一些事件,我可以覆盖响应。不是呈现默认的细枝模板,而是重定向到只返回一个JsonResponse和一个successMessage 因此,我做了以下事件: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\
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
事件。我添加了一个可能对其他人也有帮助的答案。我没有编辑,因为我不完全同意你的答案。它没有说明优先级和您所说的注册完成
事件必须有一个侦听器是错误的。另外,请注意,您不需要返回响应。