加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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);
}

但是因为它是成功事件,您可能需要覆盖方法本身.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读