У меня есть приложение 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());
}
Но возникает вопрос: как насчет одного действия для сохранения, а также обновления данных в модели (я добавляю новый элемент, когда у меня нет идентификатора)? Если / еще и два класса журнала .. все еще выглядит плохо. Не знаю, как это должно быть правильно.
1) выполнить действия по регистрации в модели save()
не в контроллерах, в saveAction. Иначе вам придется искать КАЖДОГО $model->save($objectEntity)
кусок кода и добавить запись в журнал. Если вы забудете об одном из них, ваша функция ведения журнала ненадежна, тогда ваши журналы лгут вам, вы не можете им доверять, они становятся бесполезными.
2) Если вы считаете, что нарушаете S в SOLID, потому что ваша модель save()
действие делает 2 вещи (вставка () и saveLog), нет, это не так. Потому что он делегирует ответственность за выполнение действий по протоколированию для saveLog (). Вызов saveLog () — это нормально и не нарушает SOLID.
3) статический класс Logger на самом деле не лучший выбор (его нельзя легко заменить другой реализацией, везде жестко закодированный …), но если ваше приложение не обладает способностями внедрения зависимостей, такими как контейнер, это неплохой выбор: он прост в использовании, прост в управлении и обслуживании. Если это облегчает вашу жизнь разработчика, это уже хороший шаг вперед :).
Если у вас есть Dependency Injection, внедрите сервис Logger, как, например, платформа Symfony.
4) Для вашего последнего вопроса о том, когда у вас есть сохранение и обновление, я думаю, вам понадобится журнал регистрации if / else. Да, это делает его сложным (вероятно, хорошо обернуть его в частную функцию, чтобы скрыть его сложность), но ваши журналы будут четкими и точными. И это важно.
Ваше действие по регистрации будет сложным, потому что то, что регистрируется, является сложным. С этим ничего не поделаешь.
Надеюсь это поможет
Других решений пока нет …