ebolution / laravel-core
在应用程序中使用的基本功能和工具
1.1.8
2024-01-24 11:10 UTC
Requires
- ebolution/laravel-logger: *
- ebolution/laravel-logger-db: *
README
在应用程序中使用的基本功能和工具
功能
1) 进程计时器
此功能提供了一个机制,以通用格式记录正在运行进程的信息。当调用 start
方法时,会记录一个启动消息,包括为该进程定义的唯一标识符。
当调用 stop
方法时,会记录一个结束消息,包括总处理时间和标识符,以便在后续审查中可以说明同一进程的启动和结束。
在哪里记录?
由于不同的进程可以用不同的方式进行记录,此功能提供了一个机制来支持其自己的按需记录通道。简化的顺序如下
ProcessTimerInterface
的实现必须包括LoggerFactoryInterface
的实现LoggerFactoryInterface
生成的对象是Ebolution\Logger\Infrastructure\Logger
的实例,它需要一个BuilderInterface
的实现。BuilderInterface
的特定实现承载了进程计时器使用的记录器的详细信息。
也许尝试一个例子会更容易
- 在
app/Console/Commands
中创建一个命令,使用命令artisan make:command FooProcessTimer
。 - 将命令签名替换为:
foo:process-timer
- 在应用中创建
Logging
目录mkdir app/Logging
- 创建一个名为
ProcessTimer
的新类,该类扩展了Ebolution\Core\Infrastructure\Repositories\ProcessTimer
(它实现了ProcessTimerInterface
)
namespace App\Logging;
use Ebolution\Core\Infrastructure\Repositories\ProcessTimer as CoreProcessTimer;
class ProcessTimer extends CoreProcessTimer
{
}
- 创建一个名为
LoggerFactory
的新类,该类从Ebolution\Logger\Infrastructure\LoggerFactory
继承
namespace App\Logging;
use Ebolution\Logger\Infrastructure\LoggerFactory as CoreLoggerFactory;
class LoggerFactory extends CoreLoggerFactory
{
}
- 创建一个名为
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';
}
- 由于此方法高度依赖于依赖注入,我们需要通知 Laravel 我们想为每个类传递哪些具体的实现,而不是仅仅接口,如果有的话。因此,创建一个扩展
Illuminate\Support\ServiceProvider
的类DependencyServicesProvider
并声明LoggerFactory
和ProcessTimer
类的正确注入。
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);
}
}
- 最后,转到
config/app.php
并在providers
部分中声明新创建的服务提供者。
...
\App\Logging\DependencyServicesProvider::class
...
- 返回到
App\Console\Commands\FooProcessTimer
并创建一个构造函数,注入新创建的ProcessTimer
类(请注意,我们在这里使用了 属性提升)。
public function __construct(
private ProcessTimer $processTimer
) {
parent::__construct();
}
- 现在,对于计时器本身,我们需要在命令执行时调用
start
和stop
方法。请注意,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