lsrur / inspector
Laravel Inspector,Web Artisan 的调试和性能分析工具
Requires
- lsrur/toolbelt: 0.3.*
README
概述
安装
本软件包已在 PHP 5.6、PHP 7、Laravel 5.2 和 Laravel 5.3-Dev 下进行测试
通过 composer 安装软件包
composer require lsrur/inspector
接下来,将 InspectorServiceProvider 添加到 config/app.php
中的 providers 数组
Lsrur\Inspector\InspectorServiceProvider::class,
并在相同的配置文件中添加此 Facade
'Inspector' => Lsrur\Inspector\Facade\Inspector::class,
仅用于开发期间使用,而不是生产期间,请勿编辑 config/app.php
并将以下内容添加到您的 AppServiceProvider
public function register() { // ... if ($this->app->environment() == 'development') { $this->app->register(\Lsrur\Inspector\InspectorServiceProvider::class); } // ... }
配置
要使 Inspector 成为默认异常渲染器,请在您的 Laravel 项目的 app/Exceptions/Handler.php
文件中添加以下行
public function render($request, Exception $exception) { \Inspector::renderException($exception); // <= THIS LINE return parent::render($request, $exception); }
仅用于开发
public function render($request, Exception $exception)
{
if (\App::environment() == 'development')
{
\Lsrur\Inspector\Facade\Inspector::renderException($exception);
}
return parent::render($request, $exception);
}
使用
Laravel inspector 可以通过 Facade、提供的辅助函数和 Blade 指令调用
//Using Facade \Inspector::log(...); \Inspector::info(...); //Using the "inspector" helper function inspector()->info(...); inspector()->warning($myVar); // "li" is an alias of "inspector" li()->error(...); li()->group('myGroup'); // "inspect" function makes an "Inspector::log($v)" for each passed argument inspect($var1, $var2, $var3, ...); // Dump and die using Laravel Inspector magic idd(); idd($var1, $var2); // Inside Blade @li(cmd,param1,param2,...) // samples @li('log', 'My comment', $myVar) @li(log, 'My comment', $myVar) //also works without command quotes @li(group,"myGroup") @li(endGroup)
Laravel inspector 只在配置变量 app.debug
为 true 时才激活。
无论如何,您可以使用以下方式临时关闭 Inspector(仅针对当前请求)
li()->turnOff();
消息
您可以使用以下方法检查对象和变量,每个方法都有自己的输出格式
示例
li()->log("MyData", $myData); li()->info($myData); li()->table("clients", $myClientsCollection);
此外,您还可以使用 "inspect" 辅助函数快速检查对象和变量。
inspect($var1, $var2, $var3,...);
分组消息
Laravel Inspector 允许您将消息分组为节点和子节点
li()->group('MyGroup'); li()->info($data); li()->group('MySubGroup'); li()->error('oops', $errorCode); li()->groupEnd(); li()->success('perfect!'); li()->groupEnd();
除了分组信息的能力外,每个组和子组的执行时间也将被测量并显示。如果您忘记关闭一个组,Laravel Inspector 将在脚本结束时自动执行,但该组的执行时间无法获取。
计时器
示例
li()->time("MyTimer"); // ... li()->timeEnd("MyTimer"); li()->timeStamp('Elapsed time from LARAVEL_START here');
重定向
Laravel Inspector 平滑处理重定向;显示原始和目标视图的收集器包。
输出并终止
dd()
方法(或 idd()
辅助函数)将输出整个收集器包并终止脚本
\Inspector::dd(); li()->dd(); // or simply idd(); // adding last minute data idd($var1, $var2,...)
与包的其他部分一样,此功能智能地确定输出格式,即使调用是从 CLI 执行的。
另一种进行检查的方法,但不会中断请求/响应流,是将参数 laravel_inspector=dump
添加到 URL
http://myapp.dev/contacts?id=1&laravel_inspector=dump
因此,Laravel Inspector 不会激活,直到达到可终止的中间件。
异常
函数 addException()
将检查我们捕获的异常
try { ... } catch (Exception $e) { li()->addException($e); }
可选地,您可以在开发时间(app.debug=true)将 LI 设置为默认异常渲染器。有关设置方法,请参阅 配置。
VIEW/AJAX/API 请求,工作原理
Laravel Inspector (LI) 自动检测请求/响应对的数据类型并确定输出格式。如果检测到视图响应,则需要将收集到的信息优雅地显示在浏览器控制台中的代码将作为javascript注入到该视图中。除此之外,LI 还会添加一小段纯javascript代码,作为通用的http拦截器,该拦截器将检查后续的 AJAX 调用,寻找 LI 注入的信息(该拦截器已在纯javascript、Angular 1.x (.ajax) 下进行测试,并应与任何js框架兼容)。该拦截器还在每个客户端 AJAX 调用中添加一个头部信息,让 LI 知道拦截器存在。然后,从 Laravel 的角度来看,在 AJAX 请求或 JSON 响应期间,LI 将发送一个脚本供拦截器解释(并在浏览器控制台中正确渲染),如果没有该头部信息,则假定请求是从 cURL、REST 客户端应用程序或其他地方发送的。
如果您正在开发,例如,SPA 应用程序,并且只使用 Laravel 作为 API,而不用于提供网页,您可以在客户端应用程序中包含以下代码,以充分利用 Laravel Inspector 的所有格式化功能。
(function(XHR) { "use strict"; var send = XHR.prototype.send; XHR.prototype.send = function(data) { var self = this; var oldOnReadyStateChange; var url = this._url; this.setRequestHeader('Laravel-Inspector', 'interceptor-present'); function onReadyStateChange() { if(self.readyState == 4 /* complete */) { var response = JSON.parse(this.response); if (typeof response.LARAVEL_INSPECTOR !== 'undefined') { if(typeof response.LARAVEL_INSPECTOR === 'string') { eval(response.LARAVEL_INSPECTOR); } else { console.log('LARAVEL INSPECTOR ', response); } } } if(oldOnReadyStateChange) { oldOnReadyStateChange(); } } if(!this.noIntercept) { if(this.addEventListener) { this.addEventListener("readystatechange", onReadyStateChange, false); } else { oldOnReadyStateChange = this.onreadystatechange; this.onreadystatechange = onReadyStateChange; } } send.call(this, data); } })(XMLHttpRequest);
许可证
Laravel Inspector 遵循 MIT 许可证。