У меня есть пример, где я пытаюсь создать логин AJAX с использованием Symfony2 и FOSUserBundle. Я устанавливаю свои success_handler
и failure_handler
в form_login
в моем файле security.yml
.
Вот класс:
class AjaxAuthenticationListener implements AuthenticationSuccessHandlerInterface, AuthenticationFailureHandlerInterface
{
/**
* This is called when an interactive authentication attempt succeeds. This
* is called by authentication listeners inheriting from
* AbstractAuthenticationListener.
*
* @see \Symfony\Component\Security\Http\Firewall\AbstractAuthenticationListener
* @param Request $request
* @param TokenInterface $token
* @return Response the response to return
*/
public function onAuthenticationSuccess(Request $request, TokenInterface $token)
{
if ($request->isXmlHttpRequest()) {
$result = array('success' => true);
$response = new Response(json_encode($result));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
}
/**
* This is called when an interactive authentication attempt fails. This is
* called by authentication listeners inheriting from
* AbstractAuthenticationListener.
*
* @param Request $request
* @param AuthenticationException $exception
* @return Response the response to return
*/
public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
if ($request->isXmlHttpRequest()) {
$result = array('success' => false, 'message' => $exception->getMessage());
$response = new Response(json_encode($result));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
}
}
Это прекрасно подходит для обработки как успешных, так и неудачных попыток входа в AJAX. Однако, когда включено - я не могу войти через стандартный метод POST (не AJAX). Я получаю следующую ошибку:
Catchable Fatal Error: Argument 1 passed to Symfony\Component\HttpKernel\Event\GetResponseEvent::setResponse() must be an instance of Symfony\Component\HttpFoundation\Response, null given
Я бы хотел, чтобы мои переопределения onAuthenticationSuccess
и onAuthenticationFailure
выполнялись только для запросов XmlHttpRequest (запросы AJAX) и просто передавали выполнение обратно исходному обработчику, если нет.
Есть ли способ сделать это?
TL; DR Я хочу, чтобы AJAX запрашивал попытки входа в систему, чтобы вернуть ответ JSON для успеха и неудачи, но я хочу, чтобы он не влиял на стандартный вход в систему через форму POST.