干净架构中的记录器

Mar*_*sin 8 php architecture design-patterns clean-architecture

我正在尝试在我的 PHP 应用程序中应用清洁架构。目前我有我的业务逻辑实体User和服务UsersService。UsersService收集与用户实体相关的所有用例。

UsersService->createUser(someData)获取用户存储库并将其存储在数据库中。

我createUser在控制器和 Cli 任务中调用用例。我想在我的项目中集成日志系统。我想在用例和控制器/任务内部记录一些内容。

我需要在哪里放置Loggers factory/Logger接口?

小智 3

这里的前提是,在您的内部层中,您对外部层一无所知,因此您在域中使用的任何接口都应该位于域中,这使您能够更改稍后的登录方式,而无需对业务逻辑进行任何更改,因此只需在您的域中创建一个 Log 接口,从外部实现它即可。

在您的域中,它可能如下所示:

interface ILogger {
    log(level: string, message: string): void
}

class MyUseCase {
    public constructor(private readonly logger: ILogger){}
    public execute(input: Input): void {
        // some stuff
        this.ILogger.log('level', 'message')
        // some other stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

在您的框架和驱动程序层中,您可以:

class MyLogger implements ILogger {
   log(level: string, message: string): void {
      myChosenLoggerTech.log(level, message) // ie winston, console.log, etc
   }
}
Run Code Online (Sandbox Code Playgroud)

所以现在MyUseCase实例化时可以使用:

new MyUseCase(new MyLogger())
Run Code Online (Sandbox Code Playgroud)

但是等等,没有那么简单,一般来说有两种日志用例:

  1. 您想要记录企业信息
  2. 您想要记录应用程序状态信息

好吧,如果您的情况是第 2 号,请使用此解决方案,但如果您的情况是第 1 号,也许您应该通过将日志记录操作包装到专用实体、异常或真正代表您业务的任何内容中来使日志记录操作更加明确。您可以在这里查看更详细的解释。