Sf2:FOS UserBundle:注册AJAX
发布时间:2020-12-16 02:48:56 所属栏目:百科 来源:网络整理
导读:我正在尝试使用 AJAX注册用户. 我在FOSUserEvents :: REGISTRATION_SUCCESS上创建了一个事件监听器 所以我试图知道是否已经发出了AJAX请求,但我客户端的响应并不能让我满意. 在这里我的事件监听器,请注意发送的响应是一个测试,所以当然应该没有“其他”条件.
我正在尝试使用
AJAX注册用户.
我在FOSUserEvents :: REGISTRATION_SUCCESS上创建了一个事件监听器 所以我试图知道是否已经发出了AJAX请求,但我客户端的响应并不能让我满意. 在这里我的事件监听器,请注意发送的响应是一个测试,所以当然应该没有“其他”条件. <?php namespace SEAppBundleEventListener; use FOSUserBundleFOSUserEvents; use FOSUserBundleEventFormEvent; use SymfonyComponentEventDispatcherEventSubscriberInterface; use SymfonyComponentHttpFoundationRedirectResponse; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentHttpFoundationRequestStack; /** * Ajax listener on FOS UserBundle registration */ class RegistrationListener implements EventSubscriberInterface { private $router; public function __construct(RequestStack $RequestStack) { $this->requestStack = $RequestStack; } /** * {@inheritDoc} */ public static function getSubscribedEvents() { return array( FOSUserEvents::REGISTRATION_SUCCESS => 'onRegistrationSuccess' ); } public function onRegistrationSuccess() { $request = $this->requestStack->getCurrentRequest(); if ($request->isXmlHttpRequest()) { $array = array( 'success' => true ); // data to return via JSON $response = new Response( json_encode( $array ) ); $response->headers->set( 'Content-Type','application/json' ); return $response; } else{ $array = array( 'success' => false ); // data to return via JSON $response = new Response( json_encode( $array ) ); $response->headers->set( 'Content-Type','application/json' ); return $response; } } } services.yml: se.app.listener.registration: class: SEAppBundleEventListenerRegistrationListener arguments: ["@request_stack"] tags: - { name: kernel.event_subscriber } JavaScript的: // Submit the request $.ajax({ type : 'POST',url : url,data : data,success : function(data,status,object) { console.log('success'); console.log(data); },error: function(data,object){ console.log('error'); console.log(data); } }); 首先,奇怪的是它处于错误状态. console.log(data)返回注册成功页面的DOM: ... <p>Congrats brieuc.tribouillet7777@gmail.com,your account is now activated.</p> ... 那么这个逻辑应该在这里还是我应该覆盖控制器?我究竟做错了什么? 解决方法
由于REGISTRATION_SUCCESS事件的级别,您无法直接从EventListener返回响应.
您需要获取FormEvent并修改其响应. class RegistrationListener implements EventSubscriberInterface { // ... public function onRegistrationSuccess(FormEvent $event) { $request = $this->requestStack->getCurrentRequest(); // Prepare your response if ($request->isXmlHttpRequest()) { $array = array( 'success' => true ); // data to return via JSON $response = new Response( json_encode( $array ) ); $response->headers->set( 'Content-Type','application/json' ); } else { $array = array( 'success' => false ); // data to return via JSON $response = new Response( json_encode( $array ) ); $response->headers->set( 'Content-Type','application/json' ); } // Send it $event->setResponse($response); } } 它应该工作. 注意此事件存在无法修改响应的问题. public static function getSubscribedEvents() { return [ FOSUserEvents::REGISTRATION_SUCCESS => [ ['onRegistrationSuccess',-10],],]; } 见#1799. 编辑 注意您应该使用JsonResponse而不是json_encode您的数据并手动设置Content-Type. 要获取表单本身及其最终错误,您可以执行以下操作: public function onRegistrationSuccess(FormEvent $event) { $form = $event->getForm(); if (count($validationErrors = $form->getErrors()) == 0) { return $event->setResponse(new JsonResponse(['success' => true])); } // There is some errors,prepare a failure response $body = []; // Add the errors in your response body foreach ($validationErrors as $error) { $body[] = [ 'property' => $error->getPropertyPath() // The field 'message' => $error->getMessage() // The error message ]; } // Set the status to Bad Request in order to grab it in front (i.e $.ajax({ ...}).error(...)) $response = new JsonResponse($body,400); $event->setResponse($response); } 但是因为它是成功事件,您可能需要覆盖方法本身. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |