虽然接受的答案是正确的,但这个答案解释了如何在使用 jQuery 发出 Ajax 请求时更新loic-sharma 分析器。使用这种方法不需要读取文件日志。
步骤1
第一个问题是在每个 Ajax 请求上将更新的分析器数据发送到客户端。这可以使用 Laravel 应用程序的“之后”事件来解决。
应用程序/filters.php:
App::after(function($request, $response)
{
// If it's a JsonResponse and the profiler is enabled, include it in the response.
if($response instanceof \Illuminate\Http\JsonResponse && Profiler::isEnabled()) {
$profiler = Profiler::getFacadeRoot();
$profilerJson = json_encode($profiler->render());
$content = substr($response->getContent(), 0, -1) . ',"profiler":' . $profilerJson . '}';
$response->setContent($content);
}
});
过滤器将App::after
在每个 Laravel 请求上运行。上面闭包的第一行,确保只有当响应是 JsonResponse 类型并且启用了探查器时它才会继续。如果是这种情况,请呈现分析器并将 HTML 附加到 JSON 对象。
注意:此代码假定返回的 JSON 是一个对象。所以它会失败的数组:Response::json(array(1,2,3))
.
第2步
现在更新的分析器 HTML 正在发送到客户端,我们必须使用 javascript 使用新的分析器 HTML 更新 DOM。每次客户端收到 JSON 响应时都会发生这种情况。jQuery 提供了全局 Ajax 事件处理程序,非常适合实现这一点。
$(document).ajaxSuccess(function(event, request, settings) {
try {
json = jQuery.parseJSON(request.responseText);
if(json.profiler) {
renderProfiler(json.profiler);
}
} catch(error) {
// Its not JSON.
return;
}
});
这是一种用新的分析器替换旧分析器的方法:
renderProfiler = function(data) {
// Remove previous
$anbu = $('.anbu');
$anbu.prev().remove(); // Removes <style> tag of profiler
$anbu.next().next().remove(); // Removes the inline script tag of profiler
$anbu.next().remove(); // Removes jQuery script tag by the profiler
$anbu.remove(); // Removes the <div> tag of profiler
$(document.body).append(data);
};
使用它
现在它就像返回响应一样简单:
return Response::json(array(
'user' => Auth::user()
));
Laravel 将附加分析器 HTML。javascript 将捕获 JSON 响应并更新 DOM。您将在网页上获得 SQL 查询和计时。
笔记
在测试代码时,可能会有一两个错误。这也不完全是我的做法。我没有在 json 响应中发送 HTML,而是使用来自分析器的实际数据扩展对象。在客户端,我使用mustache 模板呈现分析器。