2017-09-13 10 views
1

J'ai app php, il n'est pas compilant avec les principes SOLID, mais toute l'équipe essaie de refactore le code sur les changements. Je dois ajouter des logs globaux (stockés dans l'une des bases de données), sauvegardés sur des créations sur des mises à jour sur des modèles. Que les modèles n'utilisent pas ORM. Première solution: créer un enregistreur statique et appeler après l'opération sur le modèle:Ajouter des journaux globaux dans l'application - qu'en est-il SOLIDE

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

Mais ... est-ce correct? Je pense que n'est pas non plus compilant avec SOLID et ne voudrait pas faire de nouveaux dégâts dans le courant. Où dois-je ajouter quelque chose comme ça - sur les modèles, ou peut-être sur les contrôleurs après avoir appelé l'économie de modèle:

public function saveAction() 
{ 
    // Controller code here 

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

Mais il est question: Qu'en est-il d'une action pour sauvegarder et mettre à jour également des données dans le modèle (ajouter nouvel élément lorsque Je n'ai pas d'identifiant existant)? Si/else et deux classes de journal .. semble toujours mauvais. Aucune idée comment devrait-il être bon.

Répondre

1

1) effectuer les actions de journalisation dans le modèle save() et non dans les contrôleurs, dans saveAction. Sinon, vous devrez trouver $model->save($objectEntity) morceau de code et ajouter la journalisation. Si vous en oubliez un, votre fonction d'enregistrement n'est pas fiable, vos journaux vous mentent, vous ne pouvez pas leur faire confiance, ils deviennent inutiles.

2) Si vous pensez que vous enfreignez le S dans SOLID parce que votre action Modèle save() fait 2 choses (l'insert() et le saveLog), non, ce n'est pas le cas. Parce qu'il délègue la responsabilité d'effectuer les actions de journalisation à saveLog(). L'appel de saveLog() va bien et ne viole pas SOLID. 3) la classe Logger statique n'est en effet pas le meilleur choix (ne peut être facilement remplacée par une autre implémentation, codée en dur partout ...) mais si votre application n'a pas de capacités Dependency Injection comme un container, ce n'est pas un mauvais choix: il est facile à utiliser, facile à contrôler et à entretenir. Si cela vous facilite la vie en tant que développeur, c'est déjà un bon pas en avant :). Si vous avez une injection de dépendances, injectez un service de journalisation comme le fait par exemple l'infrastructure Symfony.

4) Pour votre dernière question sur les sauvegardes ET les mises à jour, je pense que vous aurez besoin du cas de journalisation if/else. Oui, cela le rend complexe (probablement bon pour l'envelopper dans une fonction privée pour cacher sa complexité) mais vos journaux seront clairs et précis. Et c'est important. Votre action de consignation sera complexe car ce qui est consigné est complexe. Il n'y a rien que vous puissiez faire à ce sujet.

Espérons que cela aide