Ich arbeite gerade an einem Symfony2-Projekt. Zum größten Teil ist es völlig Standard; Ich benutze den ORM-Layer, um über meine Entitäten mit der Datenbank zu kommunizieren. Keine Probleme dort.
Allerdings muss ich eine kleine Handvoll Tabellen in einem bestehenden Schema an einer anderen Stelle des Systems, das Informationen enthält, die ich als "Referenz" bezeichnen würde, nur selten anfragen: Dinge wie Währungsumrechnungsquoten und so weiter. Ich habe SELECT
nur Zugriff auf dieses Schema.
Ich habe eine andere Verbindung eingerichtet und ich habe auf die DBAL-Ebene zugegriffen, um die Abfragen für dieses Schema durchzuführen, das bisher ziemlich gut funktioniert hat.
Mein Problem ist, dass ich, obwohl es selten vorkommt, einige meiner DBAL-Abfragen an mehreren Stellen in meiner App wiederholen muss. Ich möchte diese Abfragen in eine Art Repository refactorisieren, wo sie einfacher zu benutzen sind / getestet / etc. Ich dachte darüber nach, Entitäten für die Tabellen zu erstellen, aber ich denke, das ist in diesem Fall übertrieben. Habe ich Recht damit, dass Sie Entitäten benötigen, um ein Repository zu erstellen?
Stattdessen frage ich mich, ob es einen "Symfony-Weg" gibt, um das zu tun? Etwas schönes und elegantes:)
Danke! Darragh
2013-10-03
Verzeihen Sie, dass ich eine zwei Jahre alte Antwort geschrieben habe ... Allerdings haben einige Leute den bestehenden Ansatz in Frage gestellt, und obwohl er funktioniert (und für meinen speziellen Anwendungsfall angemessen funktioniert hat), ist die Definition von Diensten natürlich
Niemand hat ein Beispiel angegeben, deshalb werde ich meine Antwort aktualisieren. Ich muss zugeben, dass ich nicht wirklich au fait mit der Definition von benutzerdefinierten Diensten war, als ich diese Antwort ursprünglich gepostet habe, aber wir leben und lernen.
Die ursprüngliche Antwort bleibt unten erhalten.
foo
in app/config/config.yml
. wrapper_class
ist in diesem Fall nicht erforderlich (siehe ursprüngliche Antwort). src/Acme/TestBundle/Resources/config/services.yml
hinzu. foo_connection
in den Service injizieren. src/Acme/TestBundle/Services/FooQueryService.php
: Zum Beispiel in einem Controller ...
%Vor% Fertig :) Danke an Acayra
und koskoz
für ihr Feedback.
Okay, ich denke, ich habe eine Lösung gefunden, die in diesem Fall für mich funktioniert.
Ich hatte tatsächlich einen anderen Blick auf die Erstellung von Entitäten / Managern - eigentlich scheint die Symfony2-Dokumentation über die Zuordnung spezifischer Entitäten zu mehreren Managern zu fehlen. Es scheint in diesem Fall immer noch ein Overkill-Ansatz zu sein (und die Referenzschemata sind ziemlich unordentlich).
Glücklicherweise ist es möglich, eine Wrapper-Klasse für eine DBAL-Verbindung anzugeben und dort Abfragen in bestimmte Methoden zu abstrahieren.
config.yml
: Beachten Sie, dass die Wrapper-Klasse \Doctrine\DBAL\Connection
erweitern muss.
Hoffe, das hilft!
Wow, Ihre Antwort bedeutet, dass Sie alle Ihre Abfragen an den gleichen Orten für jeden Tisch haben.
Ich mag diese Wrapper-Sache nicht, ich bevorzuge Dienstleistungen. Ein Service pro Tabelle oder pro Bundle, es hängt davon ab, ob Sie viele Tabellen haben und wie Sie Ihre Abfragen organisieren möchten.
Dann übergebe ich die gewünschte Verbindung als Argumente eines Dienstes und das ist alles.