2012-05-14 24 views
6

Im sử dụng FOSRestBundle để thực hiện cuộc gọi jj ajax trong Tường lửa. Tất cả mọi thứ có vẻ là làm việc tuyệt vời, với ngoại lệ mà Im không thể xử lý khi một thời gian chờ phiên đã xảy ra. Ngay bây giờ nó chuyển hướng đến login_check trong kịch bản này, trả về html thay vì json cho khách hàng.Có sự kiện/bộ xử lý symfony2 cho thời gian chờ phiên không a.k.a chưa đăng nhập

Nhận thức và sử dụng success_handler và failure_handler trong ứng dụng của tôi. Tôi không thể tìm thấy trình xử lý được tích hợp để xử lý các lỗi ủy quyền, chẳng hạn như thời gian chờ của phiên.

Có điều gì đó trong FOSRestBundle có thể giúp giải quyết vấn đề này hoặc điều gì đó mà bạn không thấy trong Symfony2?

Trả lời

5

Có, Symfony cung cấp khả năng xử lý ngoại lệ. Bạn phải tạo trình xử lý sự kiện quan sát sự kiện kernel.exception với mức độ ưu tiên cao. Tạo một event handler như thế này:

<?php 
namespace Acme\Bundle\MyBundle\EventListener; 

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; 
use Symfony\Component\HttpFoundation\JsonResponse; 
use Symfony\Component\Security\Core\Exception\AccessDeniedException; 
use Symfony\Component\Security\Core\Exception\AuthenticationException; 

class AjaxAuthenticationListener 
{ 
    public function onKernelException(GetResponseForExceptionEvent $event) 
    { 
     $request = $event->getRequest(); 

     $format = $request->getRequestFormat(); 
     $exception = $event->getException(); 
     if ('json' !== $format || (!$exception instanceof AuthenticationException && !$exception instanceof AccessDeniedException)) { 
      return; 
     } 

     $response = new JsonResponse($this->translator->trans($exception->getMessage()), $exception->getCode()); 
     $event->setResponse($response); 
     $event->stopPropagation(); 
    } 
} 

Bây giờ bạn phải đăng ký xử lý sự kiện của bạn trong một trong service.yml bạn 's, như thế này:

kernel.listener.ajax_authentication_listener: 
    class: Acme\Bundle\MyBundle\EventListener\AjaxAuthenticationListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.exception, method: onKernelException, priority: 250 } 

Lưu ý priority tham số, được sử dụng để yêu cầu Symfony thực thi trình xử lý trước các trình xử lý của riêng nó, có mức ưu tiên thấp hơn.

Và trên giao diện người dùng của bạn, bạn có thể đăng ký trình xử lý sự kiện cho jQuery, thao tác này sẽ tải lại trang trên một lỗi như vậy.

$(document).ready(function() { 
    $(document).ajaxError(function (event, jqXHR) { 
     if (403 === jqXHR.status) { 
      window.location.reload(); 
     } 
    }); 
}); 

Xem this gist để tham khảo.

Các vấn đề liên quan