laravel在哪里放置记录器类

时间:2017-10-17 13:48:28

标签: php laravel

我有两个记录器类。

1. RequestLogger (logs all incoming api request to the DB)
2. SqlLogger (logs all sql queries to the log file)

我目前将它们定义为辅助文件中的类:

1. app/Helpers/RequestLogger.php
2. app/Helpers/SqlLogger.php

但是,我不确定这是否是正确的方法。他们宁愿成为服务提供者而不是帮助者吗?目前,在这种情况下,我很难定义什么是帮助程序以及什么是服务提供者。

1 个答案:

答案 0 :(得分:0)

一般来说,文件/类都是相同的php代码,这取决于您的偏好如何组织它们。在这种情况下,根据每个类的操作,您可以将它们存储在不同的位置,并使用不同的约定命名它们。例如,在您的情况下,请求记录器是成为中间件的良好候选者。由于需要记录每个api请求,因此请创建一个中间件,例如:

namespace App\Http\Middleware;

use Closure;
use App\Models\Log;

class ApiRequestLogger
{

    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // Create the log entry here...

        return $response;
    }
}

要使用此中间件,您需要在app\Http\Kernel.php类中注册它。简单地说,您可以在api群组中添加此内容,也可以使用以下内容在$routeMiddleware中添加:

'log' => \App\Http\Middleware\ApiRequestLogger::class,

现在,您可以在每个api路径中使用它,方法是在路由声明中单独或分组添加中间件,具体取决于您的注册方式。

查询日志略有不同(逻辑上),因为您要记录每个sql查询,然后您只需在AppServiceProvider或您自己的服务提供商的boot方法中注册以下事件:

\DB::listen(function ($query) {
    // Your code here ...
    // $query->sql
    // $query->bindings
    // $query->time
    // \Log::debug($query->sql . ' - ' . serialize($query->bindings));
});

现在,这对我来说似乎没问题,但是您可以使用单独的类/帮助程序文件来存储与日志相关的代码,而不是将所有与日志相关的代码放在一起,这取决于您。如果您的查询日志足够简单,那么为什么要打扰另一个单独的类/文件,但是您可以为它使用一个单独的类并将该类存储在一个全新的目录中,即:services\QueryLogger.php或者对您来说感觉不错但在那里不是最佳或预定义的方式,Laravel不会强制您组织代码。保持简单。

注意:这些只是我的意见。关于query logging here的答案。