Laravel 5.6服务器端异常在json而不是html中返回响应

时间:2018-05-16 11:02:47

标签: json ajax exception-handling response laravel-5.6

所以,我注意到,从最后一个版本5.6开始,Laravel在处理ajax POST请求时以json格式而不是html返回服务器端异常。对于我之前版本的开发调试逻辑来说,这是一个真正的问题,因为我已经指望laravel将错误的呈现HTML页面作为响应的.responseText返回,因此我可以轻松地显示整个在新窗口中显示内容并清楚地看到它(用于调试目的)。现在发生的事情基本上如下:

  • .$ajax() POST请求正在发送到服务器;
  • 在处理响应的函数中发生了一些服务器端php错误(例如,未知变量)
  • 所以请求的ajax error函数接收到它的第一个参数(xhr),它现在是一个具有以下结构的JSON数组: enter image description here
  • 现在我想在新窗口中显示该消息,但是使用Laravel通常提供的呈现的HTML布局,我非常喜欢

我真的不想在我已经知道的时候开始自己构建html外观,Laravel可以为我渲染它。问题是我无法找到关于该主题的最新文档,也没有找到将呈现的html内容作为响应返回的正确方法。所以我的问题是,有人可以告诉我什么是渲染HTML内容的最佳选择?哪种方法是接收我想要的最佳方式,还有什么特别的方法吗? Thansk提前!

修改 这是我的ajax请求:

$.ajax({
    method: "POST",
    url: '/updateModel',
    data: dataObject,
    success: success
});

其中dataObject实际上只是请求的包含数据。我在我的初始.js文件中得到的内容如下:

$(function () {
            $.ajaxSetup({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                }
            });
            $(document).ajaxStart(function() {
                showGlobalLoader(true); //shows the loader
            })
            .ajaxStop(function() {
                showGlobalLoader(false); //hides the loader
            })
            .ajaxError(ajaxErrorGlobalFunction); //displays the new window - that's the function in question
        });

然后是ajaxErrorGlobalFunction函数

function ajaxErrorGlobalFunction(xhr, status, error) {
    if (xhr.responseText) {
        //console.log(xhr.responseText);
        openErrorWindow(xhr.responseJSON);
    }
}


function openErrorWindow(json = "")
{
    var w = window.open('', '_blank', 'scrollbars=no,status=no,titlebar=no');
    $(w.document.body).html(json.message + "\n in file " + json.file + "\n on line " + json.line);
    w.resizeTo(1000, 1000);
    w.moveTo(0, 0);
    w.focus();
}

正如您所看到的,我过去只是将xhr.responseText渲染为窗口的html内容,但现在我被迫通过从json中提取最重要的信息来解决它。我真的希望将旧的html内容作为请求的回复。提前谢谢!

1 个答案:

答案 0 :(得分:1)

正如你在异常处理程序中看到的那样(照亮/基础/异常/处理程序.php 185 ):

return $request->expectsJson()
    ? $this->prepareJsonResponse($request, $e)
    : $this->prepareResponse($request, $e);

如果请求想要一个json作为响应,它会将它转换为json,否则它会像以前那样呈现它。

dataType添加到您的Ajax请求中,该请求不是json,这应该有效:

$.ajax({
    method: "POST",
    url: '/updateModel',
    data: dataObject,
    dataType: 'html',
    success: success
});

更新

如果您希望始终将异常显示为HTML,则可以通过复制异常处理程序( app / Exceptions / Handler.php )来更新渲染功能。父母的渲染功能并移除expectsJson三元:

if (method_exists($e, 'render') && $response = $e->render($request)) {
    return Router::toResponse($request, $response);
} elseif ($e instanceof Responsable) {
    return $e->toResponse($request);
}

$e = $this->prepareException($e);

if ($e instanceof HttpResponseException) {
    return $e->getResponse();
} elseif ($e instanceof AuthenticationException) {
    return $this->unauthenticated($request, $e);
} elseif ($e instanceof ValidationException) {
    return $this->convertValidationExceptionToResponse($e, $request);
}

return $this->prepareResponse($request, $e);