lumen6 laravel6记录每次执行sql

文档:
laravel6:https://learnku.com/docs/laravel/6.x/providers/5132
lumen6:https://learnku.com/docs/lumen/6.x/providers/6118

服务提供者

服务提供者是所有 Lumen 应用程序启动的中心所在。包括你自己的应用程序,以及所有的 Lumen 核心服务,都是通过服务提供者启动的。
但是,我们所说的「启动」指的是什么?一般而言,我们指的是注册事物,包括注册服务容器绑定、事件侦听器、中间件,甚至路由。服务提供者是设置你的应用程序的中心所在。

lumen:

bootstrap/app.php 文件。
$app->register() 方法的调用。你也许需要额外的调用来注册你的服务提供者。

注册容器:

$app->register(App\Providers\EventServiceProvider::class);
在app/Providers目录新建文件EventServiceProvider.php

<?php
namespace App\Providers;

use App\Listeners\DbQueryExecutedListener;
use Illuminate\Database\Events\QueryExecuted;
use Laravel\Lumen\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider{
    /** 
    * The event listener mappings for the application. 
    * 
    * @var array 
    */
    protected $listen = [
        'App\Events\ExampleEvent' => [
            'App\Listeners\ExampleListener',
        ],
        QueryExecuted::class=>[
            DbQueryExecutedListener::class,
        ],
    ];
}

在app/Listeners目录新建文件DbQueryExecutedListener.php

<?php
namespace App\Listeners;

use Illuminate\Database\Events\QueryExecuted;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;

class DbQueryExecutedListener{
    public function __construct()
    {
    }

    /**     * @param QueryExecuted $event     */    
    public function handle(object $event)
    {
        if ($event instanceof QueryExecuted) {
            if (!env('SQL_DEBUG')) {
                return;
            }
            $sql = $event->sql;
            if (! Arr::isAssoc($event->bindings)) {
                foreach ($event->bindings as $key => $value) {
                    $sql = Str::replaceFirst('?', "'{$value}'", $sql);
                }
            }
            // 这里就是把监听到的数据堆入sql。可以dd($sql)就可以看见了
            Log::channel('sql')->info(sprintf('[%s] %s', $event->time, $sql));
        }
    }
}

解释:

在文档里面继承的是ServiceProivider
在这里插入图片描述
lumen封装了一层,其实还是继承ServiceProvider
在这里插入图片描述

app/Providers/EventServiceProvider.php里面的$listen,就是vendor/laravel/lumen-framework/src/Providers/EventServiceProvider.php里面的listen

流程:

整个流程就是项目启动的时候(相当于每次请求)【就是$app->register(App\Providers\EventServiceProvider::class);注册容器】把这些要监听的事件存起来,然后事件执行了再进行分发【调用select的时候调用注册里面的event】。

比如执行完sql之后会有个dispatcher。dispatcher:事件分发,这样才能执行listen那里的handler

  • 在执行sql的时候,sql的select方法实际上就是调用$this->run()
  • run()方法里面调用了$this->logQuery()
  • logQuery()里面调用了event

laravel6差不多。只是注册的时候不一样。可以参考文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

镜中先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值