Ich erstelle eine Anwendung in PHP und verwende Zend Framework 1 und Doctrine2 als ORM-Schicht. Alles läuft gut. Jetzt bemerkte ich zufällig, dass sowohl ZF1 als auch Doctrine2 mit ihrer eigenen Caching-Implementierung geliefert werden und sich darauf verlassen. Ich habe beide bewertet, und obwohl jeder seine eigenen Vor- und Nachteile hat, ist keiner der beiden für meine einfachen Bedürfnisse dem anderen überlegen. Beide Bibliotheken scheinen auch gegen ihre jeweiligen Schnittstellen geschrieben zu sein, nicht gegen ihre Implementierungen.
Gründe, warum ich dies für ein Problem halte, sind, dass ich während des Bootstrapings meiner Anwendung zwei Caching-Treiber konfigurieren muss - jeder mit seiner eigenen Syntax. Auf diese Weise kann leicht eine Nichtübereinstimmung erstellt werden, und es ist aus diesem Grund ineffizient, zwei Verbindungen zum Caching-Backend einzurichten.
Ich versuche herauszufinden, was der beste Weg ist, und würde mich über alle Erkenntnisse freuen, die Sie möglicherweise anbieten können.
Was ich mir bisher ausgedacht habe, sind vier Optionen:
- Tun Sie nichts, akzeptieren Sie, dass zwei Klassen mit Caching-Funktionalität vorhanden sind.
- Erstellen Sie eine Facade-Klasse, um die Schnittstelle von Zend auf die Caching-Implementierung von Doctrine zu übertragen.
- Option 2, umgekehrt: Erstellen Sie eine Fassade, um die Benutzeroberfläche von Doctrine auf einem Zend Framework-Backend abzubilden.
- Verwenden Sie die Vererbung mehrerer Schnittstellen, um eine Schnittstelle zu erstellen, die alle regiert, und beten Sie, dass es keine Überlappungen gibt (dh wenn beide eine "Speichermethode" haben, müssen sie aufgrund von PHPs Parameter in derselben Reihenfolge akzeptieren Mangel an richtigem Polymorphismus).
Welche Option ist die beste oder gibt es eine "Keine der oben genannten" Variante, die mir nicht bekannt ist?
Antworten:
Nichts tun Akzeptieren Sie, dass separate Projekte redundant sein können, solange sie in ihren eigenen Räumen arbeiten (ohne die Caches gegenseitig zu verschmutzen). Die Lehre weiß, dass Zend Caching hat, aber sie wollen nicht von Zend abhängig sein und umgekehrt. Nicht alle Menschen wollen Zend und Doctrine verwenden.
Ich würde Doctrine Code seine eigenen Sachen verwenden lassen und ZF für alles andere verwenden. Auf diese Weise muss ich nur ZF-Klassen kennen. Der Doktrin-Cache sollte nur intern von der Doktrin für das Datenbankobjekt verwendet werden. ZF verfügt über mehr Front-End, das außerhalb eines ORM nützlich ist, z. B. das Front-End für das Zwischenspeichern von HTML-Seiten.
Das Erstellen einer weiteren Ebene wäre ideal, fügt dem Projekt jedoch eine weitere Abhängigkeit hinzu, sodass die Wartung nicht sehr gut ist.
Ich weiß, dass es im Bootstrap redundant aussehen kann, mehrere Caches einzurichten. Es kann schlimmer werden, wenn Sie versuchen, ZF1, Doctrine und ZF2 gleichzeitig zu verwenden. Aber es ist eine sehr kleine konstante Zeit, da sie nur Variablen einrichten und noch keine Verbindung zu den Backends herstellen.
Aus Sicht der Programmierung, Wartung und des Betriebs würde ich sie einfach in Ruhe lassen.
quelle
Warum nicht einfach das Problem unter dem Gesichtspunkt "Konfiguration komfortabler gestalten" angehen?
Mit anderen Worten, schreiben Sie eine neue Klasse, die Ihre Konfigurationsdaten akzeptiert, und wenden Sie sie dann auf beide Caching-Treiber an. Sicher, es ist nicht so flexibel, aber das bedeutet auch, dass weniger schief gehen kann.
quelle
Warum nicht eine Abstraktion Ihrer Schnittstelle erstellen, die auf jedes der Frameworks spezialisiert werden kann? Ich würde meinen eigenen Cache-Controller mit den von mir benötigten Methoden schreiben, die beide Caches kapseln würden. Dann kann ich sie vergessen und nur mit meinem Controller sprechen. Probleme mit dieser Lösung?
quelle