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.