Symfony2: Zugriff auf den Service vom Repository aus

8

Ich habe class ModelsRepository:

%Vor%

Und Service

%Vor%

Ich möchte von ModelRepository Zugriff auf service container_data erhalten. Ich kann keinen Dienst vom Controller-Constructor übertragen.

Weißt du wie es geht?

    
Alastor 19.10.2012, 09:44
quelle

8 Antworten

5

Ich habe einige Versionen ausprobiert. Problem wurde gelöst folgt

ModelRepository:

%Vor%

security.yml:

%Vor%

services.yml

%Vor%

Als Ergebnis habe ich das Repository mit dem Container für die Fähigkeitsnutzung - je nach Bedarf - bekommen. Aber diese Erkenntnis kann nur in kritischen Fällen verwendet werden, weil sie Einschränkungen für das Repository hat. Thx 4all.

    
Alastor 19.10.2012, 12:11
quelle
12

IMHO, sollte dies nicht benötigt werden, da Sie Regeln wie SRP und Demeter-Gesetz

Aber wenn Sie es wirklich brauchen, hier ist ein Weg, dies zu tun:

Zuerst definieren wir eine Basisklasse "ContainerAwareRepository", die einen Aufruf "setContainer"

hat

services.yml

%Vor%

Das ContainerAwareRepository sieht möglicherweise so aus

AcmeBundle \ Repository \ ContainerAwareRepository.php

%Vor%

Dann können wir unser Model Repository definieren.
Wir verwenden hier die Methode getRepository der Doktrin, um unser Repository zu erstellen.

services.yml

%Vor%

Und dann definiere einfach die Klasse

AcmeBundle \ Repository \ ModelsRepository.php

%Vor%

Um das Repository zu verwenden, müssen Sie es unbedingt zuerst vom Dienst aufrufen.

%Vor%

Aber wenn Sie das direkt tun

%Vor%     
Touki 02.07.2013 16:56
quelle
8

Sie sollten niemals einen Container an das Repository übergeben, genauso wie Sie es niemals zulassen sollten, dass Entitäten schwere Logik verarbeiten. Repositories haben nur einen Zweck - das Abrufen von Daten aus der Datenbank. Nichts mehr (lesen Sie: Ссылка ).

Wenn Sie etwas komplizierteres benötigen, sollten Sie wahrscheinlich einen separaten Dienst (container-aware, falls Sie dies wünschen) dafür erstellen.

    
Itako 02.07.2013 16:30
quelle
4

Sind Sie sicher, dass es eine gute Idee ist, auf den Service von Repo zuzugreifen?

Repositories sind für benutzerdefiniertes SQL vorgesehen, wo im Falle der Doktrin die Doktrin Ihnen mit find() , findOne() , findBy() , [...] magischen Methoden helfen kann.

Berücksichtigen Sie bei der Verwendung Ihres Repos Ihren Dienst, und übergeben Sie ihn, wenn Sie einige Parameter benötigen, direkt an die Repo-Methode.

    
DonCallisto 19.10.2012 10:27
quelle
3

Ich würde vorschlagen, einen Werksservice zu verwenden:

Ссылка

%Vor%     
Piers 27.05.2016 03:52
quelle
1

Erweitere Laurynas Mališauskas Antwort, um den Dienst an einen Konstruktor weiterzugeben, mache dein Repository ebenfalls zu einem Dienst und gebe es mit Argumenten weiter:

%Vor%     
S3Mi 19.10.2012 10:08
quelle
1

Ich stimme voll und ganz zu, dass dies nur getan werden sollte, wenn es absolut notwendig ist. Obwohl es jetzt einen einfacheren Ansatz gibt (getestet mit Symfony 2.8).

  1. Implementieren Sie in Ihrem Repository "ContainerAwareInterface"
  2. Verwenden Sie das "ContainerAwareTrait"
  3. Passen Sie die services.yml
  4. an

RepositoryClass:

%Vor%

services.yml:

%Vor%     
con 08.12.2017 10:28
quelle
0

Der einfachste Weg besteht darin, den Service in den Repository-Konstruktor zu injizieren.

%Vor%     
Laurynas Mališauskas 19.10.2012 10:05
quelle

Tags und Links