Hallo MB,
das Repository sollte noch etwas mehr tun, als nur die SQLs zu kapseln. Wenn es sich auf ein ORM wie EntityFramework stützt, bekommt es das sozusagen gratis, aber zur Grundfunktionalität des Repositories gehört das Management von Objektinstanzen der Domäne, für die das Repository gedacht ist. Das heißt, du brauchst noch Folgendes:
- Anlegen neuer Objekte (bzw. übernehmen neuer Objekte ins Repository)
- Zurückschreiben geänderter Objekte in die Datenbank (abstrakter: auf das Speichermedium)
Das Repository muss zu diesem Zweck ein Verzeichnis der von ihm gelesenen Objekte führen, und auch die neu angelegten Objekte kennen. Es braucht MINDESTENS eine Methode wie
public function save( User $user ) : void { /* ... */ }
diese Methode kann dann unterscheiden, ob da ein zuvor gelesenes Objekt ankommt (dann macht sie einen Update) oder ob es ein neues Objekt ist (dann macht sie einen INSERT und besorgt eine ID). Die von Dir erwähnte add() Methode sollte eher dazu dienen, ein neu angelegtes Objekt unter Repository-Kontrolle zu bringen (damit Referenzen funktionieren), ohne es deswegen gleich in die DB zu schreiben.
Ein get($id) greift dann zunächst einmal auf den Cache zu, nicht auf die DB, und ein delete($user) markiert den User als "gelöscht". Ob man den DELETE sofort auf die DB jagt, kann man sich dann überlegen.
Auf diese Weise ist das Repository gleichzeitig eine fachliche Zugriffsschicht zur Datenablage und ein Cache für gelesene Objekte. In einem Request-Handler (sprich: ein PHP Script, dass Webseiten ausliefert) ist das durchaus legitim, da bleiben die Daten nicht lange im Speicher. Ein Langläufer müsste hier achtsamer sein und ggf. regelmäßig die Caches aktualisieren. Ein Requesthandler kann alles lesen, was er braucht, und nach Bedarf modifizieren. Wenn es die DB hergibt, gern in einer Transaktion. Zum Abschluss gibt's dann sowas wie ein "Save All" - was aber durchaus komplex sein kann, vor allem, wenn die DB Konsistenzprüfungen durchführt (Stichwort referenzielle Integrität). Ob das EntityFramework oder ein fertiges PHP ORM das korrekt und automatisch tut, weiß ich nicht, ich stelle mir den Algorithmus dafür jedenfalls schwierig vor. Deswegen baue ich meine Datenbanken gerne ohne automatische Konsistenzprüfungen und führe sie selbst im Code durch, das kann die Komplexität von Updates ungemein vereinfachen.
Rolf
Dosen sind silbern