所以,我注意到,从最后一个版本5.6开始,Laravel在处理ajax POST请求时以json格式而不是html返回服务器端异常。对于我之前版本的开发调试逻辑来说,这是一个真正的问题,因为我已经指望laravel将错误的呈现HTML页面作为响应的.responseText
返回,因此我可以轻松地显示整个在新窗口中显示内容并清楚地看到它(用于调试目的)。现在发生的事情基本上如下:
.$ajax()
POST请求正在发送到服务器; error
函数接收到它的第一个参数(xhr
),它现在是一个具有以下结构的JSON数组:
我真的不想在我已经知道的时候开始自己构建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内容作为请求的回复。提前谢谢!
答案 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);