php - 清洁架构中的记录器

标签 php design-patterns architecture

我正在尝试在我的 PHP 应用程序中应用 Clean Architecture。目前我有我的业务逻辑实体User和服务UsersService . UsersService收集与用户实体相关的所有用例。
UsersService->createUser(someData)获取用户存储库并将其存储在数据库中。

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

我需要放置 Loggers factory/Logger 的位置接口(interface)?

最佳答案

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

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

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())

但是等等,没有那么简单,一般来说有两种日志用例:
  • 您想记录业务信息
  • 您想记录应用状态信息

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

    关于php - 清洁架构中的记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53419938/

    相关文章:

    python - 修复 "IFs hell"的最佳方法是什么?

    c++ - 从 C++ 中的函数返回动态分配的缓冲区的最佳模式是什么?

    WPF/MVVM - 我们应该为每个 ViewModel 创建一个不同的类吗?

    .net - 我可以每 3 秒轮询一次数据库吗?

    php - 检查项目是否可以转换为字符串?

    php - YML 验证文件被忽略

    php - 使用动态生成的表单更新记录

    php - 我该如何使用 cron?

    ios - 在 iOS Swift 上从网络加载 MVVM 异步 UIImage

    android - 在模块化项目中分发测试源