Laravel Debugbar
针对3.0版本:需要将APP_DEBUG设置为true
针对小于5.5版本的Laravel,请使用 2.4分支
该包是对Laravel 5的PHP Debug Bar的一个整合.
该包包含一个服务提供者来注册相关服务以及来控制输出.你可通过Laravel设定配置并且发布配置.
该包会随着Laravel开始工作后启动一些常规Collector,以及针对Laravel特别动作启动的Collector来收集数据.
该包被预置成会显示重定向和Jquery的Ajax请求(请在下拉框中显示).
可以观看官方文档查看更多内容.
注意:请仅在开发时使用该包工具.由于该包会采集框架运行中的数据,所以会降低项目运行速度.当然,可以关闭一些Collector来加快框架运行速度.
该调试工具包含一些常规的Collector:
- QueryCollector:显示全部的sql查询,包含模型的绑定与查询时间
- RouteCollector:显示当前路由的全部信息.
- ViewCollector:显示当前加载的视图.(可选值:显示共享数据)
- EventsCollector:显示所有事件
- LaravelCollector:显示Laravel版本以及环境信息(默认是关闭)
- SymfonyRequestCollector:替换RequestCollector,显示请求和响应的更多信息
- LogsCollector:从缓存中读取最新一次的日志输入(默认是关闭)
- FilesCollector:显示PHP加载的文件
- ConfigCollector:显示项目配置文件中的值.(默认是关闭)
- CacheCollector:显示缓存的内容(默认是关闭)
随着Laravel开始运行,以下Collector开始运行:
- LogCollector:显示所有的日志信息
- SwiftMailCollector和SwiftLogCollector 等针对邮件的Collector
以及以下这些默认开启的Collector:
- PhpInfoCollector
- MessagesCollector
- TimeDataCollector (记录项目加载时间和应用运行时间)
- MemoryCollector
- ExceptionsCollector
该包还提供了Exceotions和Time的门面来更简单的记录信息.
安装
可以使用composer
来安装该包.建议仅安装该包的dev
版本.
composer require barryvdh/laravel-debugbar --dev
Laravel 5.5开始实现了类的自动加载,所以不需要你手动将该包注册进服务提供者中.
当你开启APP_DEBUG
为true
时,该调试工具包会开启.
如果你设置了针对所有请求作出反应的路由,请确保你在实例化APP服务提供者之前加载该包.
Laravel 5.5+:
如果你不将该包使用composer
的autoload.php
进行自动加载,那么你需要将该类加入到config/app.php
中的自动加载类配置中
Barryvdh\Debugbar\ServiceProvider::class,
如果你想使用该包自带的门面,将该门面也一起加入到config/app.php
中
'Debugbar' => Barryvdh\Debugbar\Facade::class,
如果你将APP_DEBUG
设置为true
的话,则事件监听则默认开启.你可以重置以上操作,通过设置配置文件中的(debugar.enabled
),或者在Laravel的.env
中设置DEBUGBAR_ENABLED
.更多设置请看config.debugbar.php
.
如果你想要加载vendor
目录下的文件,你也可以在配置文件中进行设置(该文件包含字体文件,高亮js和JQuery).如果你在之前已经使用他们,关闭之前的配置.
你可以将上述文件加载进js
和css
资源路径中.(Highlight.js需要css和js,所以将语法高亮设置为true
).
你可以使用以下命令将包中的配置信息保存进你的本地配置信息中:
php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"
Lumen
针对Lumen,需要将该包注册进一个服务提供者bootstrap/app.php
:
if (env('APP_DEBUG')) {
$app->register(Barryvdh\Debugbar\LumenServiceProvider::class);
}
为了使配置生效,将配置文件信息复制到配置文件目录下,并且开启它:
$app->configure('debugbar');
用法
你现在可以使用门面来获取系统错误信息.该门面的调用方式符合PSR-3规范(debug, info, notice, warning, error, critical, alert, emergency):
Debugbar::info($object);
Debugbar::error('Error!');
Debugbar::warning('Watch out…');
Debugbar::addMessage('Another message', 'mylabel');
以及获取应用计时信息:
Debugbar::startMeasure('render','Time for rendering');
Debugbar::stopMeasure('render');
Debugbar::addMeasure('now', LARAVEL_START, microtime(true));
Debugbar::measure('My long operation', function() {
// Do something…
});
或者记录异常发生情况:
try {
throw new Exception('foobar');
} catch (Exception $e) {
Debugbar::addThrowable($e);
}
在该包中还存在公共函数来处理一些常用需求:
// All arguments will be dumped as a debug message
debug($var1, $someString, $intValue, $object);
start_measure('render','Time for rendering');
stop_measure('render');
add_measure('now', LARAVEL_START, microtime(true));
measure('My long operation', function() {
// Do something…
});
你可以向服务容器或者门面中注册自定义的消息收集器:
Debugbar::addCollector(new DebugBar\DataCollector\MessagesCollector('my_messages'));
//Or via the App container:
$debugbar = App::make('debugbar');
$debugbar->addCollector(new DebugBar\DataCollector\MessagesCollector('my_messages'));
默认情况下,该调试工具在</body>
之前被注入,如果你想自定义注入位置,将配置文件中的inject
设置为false
,然后在需要位置渲染该提示信息,具体操作可请看http://phpdebugbar.com/docs/rendering.html
$renderer = Debugbar::getJavascriptRenderer();
注意:如果不适用默认的自动注入,则无法获取请求的相关信息,因为请求信息是在响应信息之后被加载的.为了能收集请求信息,你可以在配置文件中进行设置.
开启/关闭调试工具
在运行期间,可以通过以下方式开启或者关闭调试工具:
\Debugbar::enable();
\Debugbar::disable();
注意:一旦开启,该调试工具中的collector会被加载(造成额外的运行消耗),所以,所以如果你想在生产环境下使用该调试工具,请在配置文件中进行关闭,仅在需要时进行开启.
与Twig混合开发
该调试包需要两个Twig扩展.他们使用rcrowe/TwigBridge 0.6.x进行测试.
将下面的拓展添加进TwigBridge config/extensions.php中(或者手动注册以下扩展)
'Barryvdh\Debugbar\Twig\Extension\Debug',
'Barryvdh\Debugbar\Twig\Extension\Dump',
'Barryvdh\Debugbar\Twig\Extension\Stopwatch',
Dump拓展或替换dump函数来控制数据输出.该拓展可以使用debug()
函数来传递数据到Message Collector中,而不是直接在模本中进行输出.该函数会输出变量以及该变量的全部内容.
{{ debug() }}
{{ debug(user, categories) }}
Stopwatch扩展会添加一个类似于Symfony/Silex Twigbridge的标签stopwatch tag.
{% stopwatch "foo" %}
…some things that gets timed
{% endstopwatch %}