laravel 事件与监听

本文介绍了在Laravel框架下,如何实现记录SQL查询及执行时间的功能。通过在EventServiceProvider中注册事件和监听器的映射,开启事件服务,创建事件与监听器,并在控制器中触发,最终实现在访问控制器时记录并存储SQL信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

  • 针对于 lumen,具体版本如下:
    Laravel Framework Lumen (5.7.3) (Laravel Components 5.7.*)

实际操作(记录 sql 以及执行时间)

注册映射关系
  • EventServiceProvider中注册事件与监听器之间的映射关系:
        'App\Events\SqlRecorded' => [
            'App\Listeners\RecordSqlNotification',
        ],
开启事件服务
  • lumen 默认不开启,在 bootstrap/app.php 文件中注册
 $app->register(App\Providers\EventServiceProvider::class);
创建事件 event
  • 文件 app/Events/SqlRecorded.php
<?php

namespace App\Events;

use Illuminate\Support\Facades\DB;

class SqlRecorded extends Event
{
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct()
    {
        DB::connection()->enableQueryLog();
    }

    public function broadcastOn()
    {
        return [];
    }
}
创建监听 listen
  • 文件 app/Listeners/RecordSqlNotification.php
<?php

namespace App\Listeners;

use App\Events\SqlRecorded;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\DB;

class RecordSqlNotification
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  SqlRecorded $event
     * @return void
     */
    public function handle(SqlRecorded $event)
    {
        $path = storage_path('logs') . DIRECTORY_SEPARATOR . 'sql-' . date('Y-m-d') . '.log';
        $queries = $this->refactor();
        file_put_contents($path, json_encode($queries) . "\n", FILE_APPEND);
    }

    public function refactor()
    {
        $queries = DB::getQueryLog();
        foreach ($queries as &$query) {
            $bindings = count($query['bindings']);
            if ($bindings > 0) {
                $search = array_fill(0, $bindings, '?');
                $sql = str_replace($search, $query['bindings'], $query['query']);
                $query['query'] = $sql;
            }
            $query = [
                'query' => $query['query'],
                'time' => $query['time']
            ];
        }
        return $queries;
    }
}
访问控制器
    public function event()
    {
        $event = new SqlRecorded();
        $res = (new User())->where('username', 'Jerry')->where('gender', 1)->get();
        /*分发事件,此时事件将被监听,以下两种方式都可以实现*/
        event($event);
        //event::fire($event);
    }

结束

  • 注册路由后即可访问控制方法,并将sql存入指定文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值