Laravel 5.2中记录运行时 SQL

本文介绍了在 Laravel 5.2 中如何通过事件监听器记录程序执行的 SQL。首先创建监听器,然后注册事件,并在监听器中添加逻辑,将 SQL 信息记录到日志。Laravel 5.2 对比 5.1 的变化在于事件标识和监听器参数的不同,使得记录 SQL 更加方便。
摘要由CSDN通过智能技术生成

在开发过程中,我们有时候可能希望记录下程序执行的每一条 SQL,在 Laravel 中我们可以利用事件及其监听器很方便的实现这一需求。

本站之前曾发布过一篇相关的文章,不过是针对5.1及更老的版本,而在 Laravel5.2 中不再适用。所以就有了此文。

第一步:创建监听器

php artisan make:listener QueryListener --event=Illuminate\\Database\Events\\QueryExecuted

生成文件于 app/Listeners/QueryListener.php

第二步:注册事件

打开 app/Providers/EventServiceProvider.php,在 $listen 中添加 illuminate.query 事件的监听器为 QueryListener

protected $listen = [
        \Illuminate\Database\Events\QueryExecuted::class => [
            QueryListener::class
        ],
    ];

当然在类前面你需要 use App\Listeners\QueryListener; 不然就报类不存在了。

第三步:添加逻辑

光有一个空的监听器是不够的,我们需要自己实现如何把 $sql 记录到日志中。为此,对 QueryListener 进行改造,完善其 handle 方法如下:

    /**
     * Handle the event.
     *
     * @param QueryExecuted $event
     *
     * @return void
     */
    public function handle($event)
    {
        if (env('APP_ENV', 'production') == 'local') {
            $sql = str_replace("?", "'%s'", $event->sql);

            $log = vsprintf($sql, $event->bindings);

            Log::info($log);
        }
    }

上面我们用到了 Log 门面,请注意在类开头引用,或者使用 \Log::info() 代替之。

至此大功告成,在调试模式下程序所执行的 SQL 都会被一一记录在案,方便我们调试。形式如下:

[2016-07-29 18:08:15] local.INFO: select * from `app_articles` where `app_articles`.`id` = '40' limit 1

可以看到,相对于5.1中的做法,本文中所诉的有不少变化。

首先,5.2中不再有 illuminate.query 等形式的框架事件标识,所以我们在注册事件及其监听器时需要使用真实的事件类名。

其次,5.2中事件监听器的 handle 方法只支持接收一个参数,此例中是一个\Illuminate\Database\Events\QueryExecuted 类型的对象,该对象中包含查询时的SQL、查询参数及查询时间等量,对于我们记录日志而言十分方便。

本文由本人编辑,首发于 http://laravel.so,转载装注明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值