Bewährte Methode zum Organisieren wiederverwendbarer DBAL-Abfragen in Symfony2?

8

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

    
Darragh Enright 23.11.2011, 11:03
quelle

2 Antworten

11

Aktualisieren

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 Symfony Weg .

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.

1. Erstellen Sie eine zusätzliche DBAL-Verbindung

  • Erstellen Sie die Verbindung foo in app/config/config.yml .
  • Argument wrapper_class ist in diesem Fall nicht erforderlich (siehe ursprüngliche Antwort).
%Vor%

2. Konfigurieren Sie den Dienst

  • Annahme des YAML-Formats.
  • Fügen Sie Konfiguration zu src/Acme/TestBundle/Resources/config/services.yml hinzu.
  • Beachten Sie, dass wir den oben definierten DBAL foo_connection in den Service injizieren.
%Vor%

3. Erstellen Sie eine Klasse für den konfigurierten Service

  • Erstellen Sie die folgende Klasse unter src/Acme/TestBundle/Services/FooQueryService.php :
%Vor%

4. Schließlich, verwenden Sie Ihre Abfragen, wo immer Sie sie brauchen!

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.

  1. Erstellen Sie eine zusätzliche DBAL-Verbindung mit einer Wrapper-Klasse in config.yml :
%Vor%
  1. Erstellen Sie die Wrapper-Klasse unter dem angegebenen Pfad:
%Vor%

Beachten Sie, dass die Wrapper-Klasse \Doctrine\DBAL\Connection erweitern muss.

  1. Verwenden Sie Ihre Abfragen, wo immer Sie sie brauchen:
%Vor%

Hoffe, das hilft!

    
Darragh Enright 23.11.2011, 12:47
quelle
0

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.

    
DevAntoine 03.10.2013 14:39
quelle

Tags und Links