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.
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"
hatservices.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%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.
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.
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).
RepositoryClass:
%Vor%services.yml:
%Vor%Der einfachste Weg besteht darin, den Service in den Repository-Konstruktor zu injizieren.
%Vor%