2017-04-12 47 views
0

在我的Symnfony3項目中,我注意到在註冊過程中會生成一些事件,我可以重寫響應。例如。而不是呈現默認的樹枝模板和重定向,只是返回一個帶有successMessage的JsonResponse。Symfony 3:FOSSUserBundle獲取JsonResponse而不是重定向

所以我做了以下事件訂閱:

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調用來實現註冊,而不是呈現註冊頁面和重定向。

+0

當註冊成功時,您將獲得一個302重定向響應,否則爲一個BadRequest響應。如果您成功時不需要返回任何特定數據,則可以等待Ajax調用中的302,並以您需要的方式處理它,因爲您可以認爲它是成功的。讓我知道如果您的註冊錯誤偵聽器不能正常工作,我會用一個工作示例發佈一個答案。 –

+0

我需要返回Json,因爲我想實現單頁面應用程序,所有「重定向」都將通過Javascript完成,而不是302重定向。 –

回答

0

你應該這樣做步驟:

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

services.yml:所有的

首先在定義事件訂閱therfore你的用戶會像被定義,你應該使用的kernel.event_subscriber代替app.user_register.subscriber。另外getSubscribedEvents必須返回偵聽器數組。也有FOSUserEvents::REGISTRATION_COMPLETED必須有一個監聽器,即使它沒有實現,如果你不想讓一個監聽器只是評論一樣。

到底你的聽衆shuld實現這樣的:

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; 
    } 
} 
+0

很高興你讓它工作,但我相信實際的問題是,你應該優先考慮'REGISTRATION_SUCCESS'事件,除了像你說的那樣標記爲'kernel.event_subscriber'。我添加了一個可以幫助其他人的答案。 –

+0

你可以編輯我的並添加缺失的位。 –

+0

我沒有編輯,因爲我沒有完全同意你的答案。它沒有提到優先級和你的聲明,說一個REGISTRATION_COMPLETED事件必須有一個監聽器是錯誤的。另外請注意,您不需要返回響應。 –

1

,當你有登記確認(在FOSUserBundle默認行爲)你應該優先考慮REGISTRATION_SUCCESS事件,看到http://symfony.com/doc/master/bundles/FOSUserBundle/controller_events.html#registration-success-listener-with-enabled-confirmation-at-the-same-time

服務定義需求如下所示:

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