Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 清洁体系结构中的记录器_Php_Design Patterns_Architecture - Fatal编程技术网

Php 清洁体系结构中的记录器

Php 清洁体系结构中的记录器,php,design-patterns,architecture,Php,Design Patterns,Architecture,我试图在我的PHP应用程序中应用干净的体系结构。目前,我有我的业务逻辑实体用户和服务用户服务用户服务收集与用户实体相关的所有用例 UsersService->createUser(someData)获取用户存储库并将其存储在数据库中 我在控制器和Cli任务中调用createUser用例。我想在我的项目中集成日志系统。我想在用例和控制器/任务中记录一些东西 我需要将我的记录器工厂/Logger接口放在哪里?这里的前提是,在您的内部层中,外部层什么都不知道,因此您在域中使用的任何接口都应该放在域中,

我试图在我的PHP应用程序中应用干净的体系结构。目前,我有我的业务逻辑实体
用户
和服务
用户服务
<代码>用户服务收集与用户实体相关的所有用例

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

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


我需要将我的
记录器工厂/Logger
接口放在哪里?

这里的前提是,在您的内部层中,外部层什么都不知道,因此您在域中使用的任何接口都应该放在域中,这使您能够在不改变业务逻辑的情况下更改以后的日志记录方式,所以,只要在您的域中创建一个日志接口,从外部实现它就可以了

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

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个,那么您可能应该通过将其包装到一个专用的实体、异常或任何真正代表您的业务的东西中,使日志记录的操作更加明确。
    您可以查看更详细的解释。

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

    e、 域层不能依赖于基础结构层。因此,可以在域层中放置接口ILogger

    然而,如果将ILogger放在域项目中,则表明日志记录与业务域相关

    对我来说,记录器本质上是通用工具,因此我将在“通用”项目中放置一个ILogger接口,该项目在整个解决方案中无处不在。在基础架构层实现ILogger。

    只需使用一个decorator:(有点老了)。您可以使用DIC在需要的任何级别申请。