2017-01-06 3 views
0

Ich frage mich, ob es eine Schnittstelle gibt, die verschiedene ORM für Symfony implementieren sollte oder nicht.Hat Symfony eine Schnittstelle für ORMs?

Die Frage kam auf, als ich einen Dienst baute, der ein ORM akzeptiert (Lehre jetzt), und Typ erklären wollte.

Ich denke, verschiedene ORM haben unterschiedliche Verhalten und Klassen ... in solchen Fällen, wie kann man Einheiten bauen, die nicht von bestimmten ORM abhängen, falls man später wechseln will?

+1

Symfony hat keine ORM-Schnittstellen. Doctrine selbst hat verschiedene Ebenen und insbesondere Doctrine \ Common \ Persistence \ ObjectManager und ObjectRepository. Jeder ORM, der diese beiden Schnittstellen implementiert, könnte (theoretisch) ohne viel Änderung eingesteckt werden. Ich kenne keine anderen ORMs, die das tun. Um ehrlich zu sein, ist es ziemlich unrealistisch zu erwarten, dass so etwas wie ein ORM ausgetauscht werden kann. Zu viele feine Unterschiede werden auftauchen. – Cerad

Antwort

5

Im Allgemeinen ist Symfony in Bezug auf Ihre Wahl von ORM agnostisch.

Die standard edition wird mit Doctrine ausgeliefert und enthält auch einen "Bridge" -Code, um die Integration zu erleichtern.

Sie können jedoch jedes beliebige ORM verwenden. Zum Beispiel funktioniert Propel auch gut mit Symfony. Das Propel-Team unterhält auch eine integration bundle.

Es gibt keine "Schnittstelle" im Sinne einer formalen Beschreibung, der ein ORM entsprechen muss. So etwas wie interface SymfonyOrmInterface {} gibt es nicht.

Denken Sie darüber nach, wie und warum sollte Symfony das verlangen? Symfony ist ein HTTP-Framework, das auf einer Reihe von lose gekoppelten Komponenten basiert. Die meisten dieser Komponenten wissen nicht einmal, was ein ORM ist oder ob es momentan in der Anwendung verfügbar ist.

Normalerweise installieren Sie Ihr ORM über Composer, und es wird in Ihrem Geschäftscode verfügbar sein (vorausgesetzt, es unterstützt Autoloading mit PSR-0/-4).

Natürlich für eine richtige Integration eines ORM in Symfony, gibt es einige Konventionen und Merkmale, wie zum Beispiel:

  • CLI-Befehle, z.B. für Schema-Updates, Managing
  • Konfigurationswerte durch die globale config.yml und parameters.yml Dateien,
  • Dienste und Abhängigkeiten durch Dependency Injection Providing.

Diese werden in Integrationspaketen implementiert, die normalerweise vom jeweiligen ORM-Anbieter bereitgestellt werden.

Für Ihre Business-Code bedeutet dies, dass Sie nicht einfach ein ORM durch ein anderes ersetzen können. ORMs unterscheiden sich signifikant in Bezug auf Speicherabstraktion, Zwischenspeicherung, Abfrage, Hydration usw. Der Austausch eines ORM erfordert immer, dass Sie Ihre Geschäftslogik auf einen bestimmten Zeitraum und nicht nur in einem Symfony-Projekt anpassen.

+0

Aber gibt es eine Schnittstelle, die diese ORM implementieren sollten? – JorgeeFG

+0

Nein, Symfony deklariert das nicht. Wie stellst du dir diese Schnittstelle vor? Eine weitere Abstraktionsschicht über viele ORMs? http://softwareengineering.stackexchange.com/q/170619/257809 – Timurib

+0

@JorgeeFG: Nein, gibt es nicht. Siehe mein Update. – lxg

Verwandte Themen