2016-04-03 26 views
4

AJAX ile bir kullanıcı kaydettirmeye çalışıyorum. Sf2: FOS UserBundle: kayıt AJAX

Ben yüzden yapılmış bir AJAX isteği ama beni tatmin etmiyor benim istemci tarafında tepki bilmek olduğunu çalışıyorum

FOSUserEvents::REGISTRATION_SUCCESS bir olay dinleyicisi yarattı.

Burada benim olay dinleyicim, gönderilen yanıtın bir test olduğunu unutmayın, bu nedenle "başka" bir koşul olmamalıdır.

<?php 

namespace SE\AppBundle\EventListener; 

use FOS\UserBundle\FOSUserEvents; 
use FOS\UserBundle\Event\FormEvent; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpFoundation\RequestStack; 

/** 
* 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: SE\AppBundle\EventListener\RegistrationListener 
    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, status, object){ 
     console.log('error'); 
     console.log(data); 
    } 
}); 

Öncelikle garip şey hata durumunda gitmesidir.

console.log (veri) kayıt başarı sayfanın DOM döndürülür:

... 
<p>Congrats [email protected], your account is now activated.</p> 
... 

Yani bu mantık burada olmalı mı ya da denetleyicisi geçersiz gerekir? Neyi yanlış yapıyorum?

cevap

3

REGISTRATION_SUCCESS olay düzeyinden dolayı, EventListener numaralı telefondan yanıt atamıyorsunuz.

FormEvent'u yakalamanız ve yanıtını değiştirmeniz gerekiyor.

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

Ve çalışması gerekir:
argüman olarak iletin sağlar.

Not Yanıtın değiştirilemediği bu olay hakkında bir sorun var. Sorun oluşursa
, etkinlik abone düşük öncelik ayarlamak gerekir:

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

#1799 bakınız.

DÜZENLEME

Not Bir JsonResponse yerine json_encode verilerinizi kullanmak ve el Content-Type koymalıdır.

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

Ama başarı olay, çünkü yöntemini kendisi geçersiz gerekebilir:

formunu kendisi ve nihai hatalar kapmak için, bunu yapabilirsiniz.

+0

Awesome! Bu yüzden bir olay dinleyicisini bu yöntemi geçersiz kılmaktan daha iyi kullanmak daha iyi değil mi? Fos kullanıcı etkinliklerinden birinde de form hatalarını yakalayabilecek misiniz? – Brieuc

+0

Düzenlememe bakıyorum :), Ve tamamen olaylara bağlı, sanırım REGISTRATION_FAILURE etkinliği yok, bu durumda bu yöntemi geçersiz kılmanız gerekebilir. – chalasr

+1

Açık cevap için teşekkür ederiz. – Brieuc