ebolution/laravel-core

在应用程序中使用的基本功能和工具

1.1.8 2024-01-24 11:10 UTC

This package is auto-updated.

Last update: 2024-09-10 09:04:09 UTC


README

在应用程序中使用的基本功能和工具

功能

1) 进程计时器

此功能提供了一个机制,以通用格式记录正在运行进程的信息。当调用 start 方法时,会记录一个启动消息,包括为该进程定义的唯一标识符。

当调用 stop 方法时,会记录一个结束消息,包括总处理时间和标识符,以便在后续审查中可以说明同一进程的启动和结束。

在哪里记录?

由于不同的进程可以用不同的方式进行记录,此功能提供了一个机制来支持其自己的按需记录通道。简化的顺序如下

  1. ProcessTimerInterface 的实现必须包括 LoggerFactoryInterface 的实现
  2. LoggerFactoryInterface 生成的对象是 Ebolution\Logger\Infrastructure\Logger 的实例,它需要一个 BuilderInterface 的实现。
  3. BuilderInterface 的特定实现承载了进程计时器使用的记录器的详细信息。

也许尝试一个例子会更容易

  1. app/Console/Commands 中创建一个命令,使用命令 artisan make:command FooProcessTimer
  2. 将命令签名替换为:foo:process-timer
  3. 在应用中创建 Logging 目录 mkdir app/Logging
  4. 创建一个名为 ProcessTimer 的新类,该类扩展了 Ebolution\Core\Infrastructure\Repositories\ProcessTimer(它实现了 ProcessTimerInterface
namespace App\Logging;

use Ebolution\Core\Infrastructure\Repositories\ProcessTimer as CoreProcessTimer;

class ProcessTimer extends CoreProcessTimer
{

}
  1. 创建一个名为 LoggerFactory 的新类,该类从 Ebolution\Logger\Infrastructure\LoggerFactory 继承
namespace App\Logging;

use Ebolution\Logger\Infrastructure\LoggerFactory as CoreLoggerFactory;

class LoggerFactory extends CoreLoggerFactory
{

}
  1. 创建一个名为 LoggerBuilder 的新类,该类从 Ebolution\Logger\Domain\LoggerBuilder 继承。在这里定义了按需记录器。在这个例子中,日志消息被写入文件,但还有许多其他选项。如果您想有不同的行为,只需覆盖此类中的方法。请确保提供
    日志文件的路径(必需)以及要添加到日志中的前缀(可选)。
namespace App\Logging;

use Ebolution\Logger\Domain\LoggerBuilder as CoreLoggerBuilder;

class LoggerBuilder extends CoreLoggerBuilder
{
    protected string $path = 'logs/foo.log';
    protected string $prefix = 'Foo';
}
  1. 由于此方法高度依赖于依赖注入,我们需要通知 Laravel 我们想为每个类传递哪些具体的实现,而不是仅仅接口,如果有的话。因此,创建一个扩展 Illuminate\Support\ServiceProvider 的类 DependencyServicesProvider 并声明 LoggerFactoryProcessTimer 类的正确注入。
namespace App\Logging;

use Illuminate\Support\ServiceProvider;
use Ebolution\Logger\Domain\BuilderInterface;
use Ebolution\Logger\Domain\LoggerFactoryInterface;

final class DependencyServicesProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->when(LoggerFactory::class)
            ->needs(BuilderInterface::class)
            ->give(LoggerBuilder::class);

        $this->app->when(ProcessTimer::class)
            ->needs(LoggerFactoryInterface::class)
            ->give(LoggerFactory::class);
    }
}
  1. 最后,转到 config/app.php 并在 providers 部分中声明新创建的服务提供者。
...

\App\Logging\DependencyServicesProvider::class

...
  1. 返回到 App\Console\Commands\FooProcessTimer 并创建一个构造函数,注入新创建的 ProcessTimer 类(请注意,我们在这里使用了 属性提升)。
    public function __construct(
        private ProcessTimer $processTimer
    ) {
        parent::__construct();
    }
  1. 现在,对于计时器本身,我们需要在命令执行时调用 startstop 方法。请注意,start 需要一个进程名称。
    public function handle()
    {
        $this->processTimer->start('Foo process');
        sleep(5);
        $this->processTimer->stop();

        return Command::SUCCESS;
    }

现在我们可以通过执行命令 artisan foo:process-timer 来检查一切是否到位,并转到 storage/logs/foo.log 来检查输出。

上述所有说明均旨在遵循经典开发模式,然而,我们建议使用模块化方法,并结合使用 Ebolution_ModuleManager 模块。逻辑相同,但文件位置不同。

当然,这是一个十步的过程,我们欢迎优化、自动化和改进。只需大胆提出您的建议即可:D