Symfony2 AuthenticationFailureHandler - JSON renderView from


Symfony2 AuthenticationFailureHandler - JSON renderView from RedirectResponse

我正在使用带有FOSUserBundle的Symfony2,我想使用Ajax进行用户登录。我使用了一个扩展 DefaultAuthenticationFailureHandler 类的服务:

<?php
namespace Marquis'WebsiteBundle'Handler;
use Psr'Log'LoggerInterface;
use Symfony'Component'Translation'Translator;
use Symfony'Component'HttpFoundation'JsonResponse;
use Symfony'Component'HttpFoundation'Response;
use Symfony'Component'HttpFoundation'RedirectResponse;
use Symfony'Component'HttpFoundation'Request;
use Symfony'Component'HttpKernel'HttpKernelInterface;
use Symfony'Component'Security'Core'Exception'AuthenticationException;
use Symfony'Component'Security'Http'Authentication'DefaultAuthenticationFailureHandler;
use Symfony'Component'Security'Http'HttpUtils;
class AuthenticationFailureHandler extends DefaultAuthenticationFailureHandler {
    protected $translator;
    public function __construct(HttpKernelInterface $httpKernel, HttpUtils $httpUtils, array $options, LoggerInterface $logger = null, Translator $translator = null) {
        parent::__construct($httpKernel, $httpUtils, $options, $logger);
        $this->translator = $translator;
    }
    public function onAuthenticationFailure(Request $request, AuthenticationException $exception) {
        if($request->isXmlHttpRequest()) {
            /* @var $formResponse RedirectResponse */
            $formResponse = parent::onAuthenticationFailure($request, $exception);
            $response = new JsonResponse(array('success' => false,
                'message' => $this->translator->trans($exception->getMessage(), array(), 'FOSUserBundle'),
                'form' => $formResponse->getTargetUrl()));
        } else {
            $response = parent::onAuthenticationFailure($request, $exception);
        }
        return $response;
    }
}

它运行良好,但我想将渲染的视图转换为"表单"JsonResponse 值。

是否可以从重定向响应对象生成视图?

如果我

理解正确,您想呈现一个视图并在登录或注册页面上显示该视图吗?

如果是这样,你可以直接返回你的视图,从javascript代码中解析为html,并附加到你想要的任何位置。

return $this->twig->render("SampleBundle:sample.html.twig", $data); //$data is not required

您可以像这样将加载的 HTML 附加到您的容器中;

$.ajax({
  dataType:"html",
  success: function(response){
    response.append('#container');
  }
});