在应用程序中添加全局日志 - SOLID 怎么样

Add global logs in app - what about SOLID

我有 php 应用程序,它不符合 SOLID 原则,但整个团队尝试重构代码以进行更改。我必须添加全局日志(存储在其中一个数据库中),保存在模型更新的创建中。该模型不使用 ORM。第一个解决方案:创建静态记录器并在模型操作后调用:

public function save(ObjectEntity $entity)
{
    // Some code to prepare entity
    $this->insert($entity);

    Logger::saveLog('Object has been saved');

    // Or maybe better - separate classes for logs with interface 
    Logger::save(new LogObjectEntitySave());
}

但是……是这样吗?我认为也不符合 SOLID 并且不想在当前造成新的混乱。我应该在哪里添加这样的东西 - 在模型上,或者在调用模型保存后在控制器上:

public function saveAction()
{
    // Controller code here

    $model->save($objectEntity);
    Logger::save(new LogObjectEntitySave());
}

但有一个问题:在模型中保存和更新数据的一个操作怎么样(我在没有现有 ID 时添加新元素)? If/else 和两个日志 类.. 看起来仍然很糟糕。不知道应该怎样才对。

1) 在模型 save() 中执行记录操作,而不是在控制器中,在 saveAction 中。否则,您将不得不找到每 $model->save($objectEntity) 段代码并添加日志记录。如果您忘记了其中之一,您的日志记录功能将不可靠,您的日志就会对您撒谎,您无法信任它们,它们将变得毫无用处。

2) 如果您认为您违反了 SOLID 中的 S,因为您的模型 save() 操作做了 2 件事(insert() 和 saveLog),不,它没有。因为它将执行日志记录操作的责任委托给了 saveLog()。调用 saveLog() 没问题,不违反 SOLID。

3) static Logger class 确实不是最好的选择(不能轻易被另一个实现替换,到处都是硬编码......)但是如果你的应用程序没有容器等依赖注入能力,这不是一个糟糕的选择:它易于使用、易于控制和维护。如果它让您作为开发人员的生活更轻松,那已经是向前迈出的一大步 :) .

如果您有依赖注入,请像 Symfony 框架那样注入 Logger 服务。

4) 关于你何时进行保存和更新的最后一个问题,我认为你将需要 if/else 日志记录案例。是的,这使它变得复杂(将其包装在私有函数中以隐藏其复杂性可能很好),但您的日志将清晰准确。这很重要。 您的日志记录操作将很复杂,因为记录的内容很复杂。你对此无能为力。

希望对您有所帮助