干净架构中的记录器

时间:2018-11-21 20:22:32

标签: php design-patterns architecture

我正在尝试在PHP应用程序中应用Clean Architecture。目前,我有我的业务逻辑实体User和服务UsersServiceUsersService收集与User实体相关的所有用例。

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

我在控制器和Cli任务中调用了createUser用例。我想将日志记录系统集成到我的项目中。我想在用例和控制器/任务中记录一些东西。

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

2 个答案:

答案 0 :(得分:1)

这里的前提是内部层对外部层一无所知,因此您在域中使用的任何接口都应位于域中,这使您能够更改以后的登录方式,而无需进行任何更改您的业​​务逻辑,因此只需在您的域中创建一个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
    }
}

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

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

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

new MyUseCase(new MyLogger())

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

  1. 您要记录业务信息
  2. 您要记录应用状态信息

好吧,如果您的案例是2号,则采用此解决方案,但是如果您的案例是1号,则可能应该通过将日志包装到专用实体,异常或真正代表您的业务的内容中来使日志记录的操作更加明确。 您可以检查here以获得更详细的说明。

答案 1 :(得分:0)

在“干净的体系结构”中,不允许内层依赖于外层。

例如域层不得依赖基础结构层。因此,您可以在域层中放置一个接口ILogger。

但是,将ILogger放置在Domain项目中,将建议日志记录与业务域相关。

对我来说,Logger本质上是通用工具,因此我会将ILogger接口放在“通用”项目中,该解决方案在整个解决方案中都被普遍引用。通过在基础结构层中实现ILogger。