Php 在应用程序中添加全局日志-SOLID呢

Php 在应用程序中添加全局日志-SOLID呢,php,logging,design-patterns,solid-principles,single-responsibility-principle,Php,Logging,Design Patterns,Solid Principles,Single Responsibility Principle,我有一个php应用程序,它不是一个有坚实原则的编译器,但整个团队都在尝试对代码进行重构。我必须添加全局日志(存储在其中一个数据库中),保存在模型更新的创建上。模型不使用ORM。第一个解决方案:创建静态记录器并在对模型进行操作后调用: public function save(ObjectEntity $entity) { // Some code to prepare entity $this->insert($entity); Logger::saveLog('

我有一个php应用程序,它不是一个有坚实原则的编译器,但整个团队都在尝试对代码进行重构。我必须添加全局日志(存储在其中一个数据库中),保存在模型更新的创建上。模型不使用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());
}
但是。。。对吗?我认为也不是编译与固体,不想在当前的新混乱。我应该在哪里添加类似的内容-在模型上,或者在调用模型保存后在控制器上:

public function saveAction()
{
    // Controller code here

    $model->save($objectEntity);
    Logger::save(new LogObjectEntitySave());
}
但有一个问题:在模型中保存和更新数据的一个操作(我在没有现有id的情况下添加新元素)怎么样?If/else和两个日志类。。看起来还是很糟糕。不知道该怎么做。

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

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

3) 静态记录器类确实不是最佳选择(不能轻易地被另一个实现取代,到处都是硬编码的…),但如果您的应用程序没有容器之类的依赖注入功能,这不是一个坏选择:它易于使用、易于控制和维护。如果这能让你的开发者生活更轻松,那么这已经是一个很好的进步:)

如果您有依赖注入,则注入一个记录器服务,就像Symfony框架所做的那样

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

希望这有帮助