文档:
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差不多。只是注册的时候不一样。可以参考文档