Symfony2 と FOSUserBundle を使用して AJAX ログインを作成しようとしている例があります。私は自分のファイルに自分自身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
my onAuthenticationSuccess
and onAuthenticationFailure
overrides を XmlHttpRequests (AJAX リクエスト) に対してのみ実行し、そうでない場合は実行を元のハンドラーに戻すだけにしたいと思います。
これを行う方法はありますか?
TL;DR AJAX で要求されたログイン試行で、成功と失敗の JSON 応答が返されるようにしたいのですが、フォーム POST を介した標準のログインには影響しないようにしたいと考えています。