2016-04-22 11 views
1

Ich bin auf zwei Methoden gestoßen, um Abhängigkeiten in benutzerdefinierte Doctrine-Repositories zu injizieren.Abhängigkeitsinjektion im benutzerdefinierten Doktrinen-Repository

  1. https://juriansluiman.nl/article/142/dependency-injection-in-a-doctrine-repository
  2. http://blog.tomhanderson.com/2016/01/dependency-injection-in-doctrine.html

Ich verstehe Methode ein, dass sie nicht mehr verwendet die Entity-Manager das Repository abgerufen und verwendet stattdessen den Service-Manager.

Allerdings verstehe ich Methode zwei nicht. Es gibt zwei Teile, die ich nicht verstehe. Der erste ist der Abschnitt "Konfiguration". Was macht der Doctrine-Konfigurationsschlüssel "repository_factory"?

return array(
    'doctrine' => array(
     'configuration' => array(
      'orm_default' => array(
       'repository_factory' => 'Db\Repository\RepositoryFactory', 
      ), 
     ), 
    ), 

    'service_manager' => array(
     'invokables' => array(
      'Db\Repository\RepositoryFactory' => 'Db\Repository\RepositoryFactory', 
     ), 
    ), 
); 

Dann zweitens bin ich mir nicht sicher, wie Sie das Repository abrufen. Soll ich den Entity Manager noch verwenden? Oder sollte ich den Service Manager wie in Methode eins verwenden?

Antwort

1

Soweit ich es verstehe, gibt der zweite Link eine Möglichkeit, die Standardargumente zu überschreiben, die an das Repository übergeben werden, wenn es instanziiert wird.

Die primäre Rolle einer Factory (nicht nur in Symfony, es ist eine allgemeine design pattern) ist, Instanzen von einer oder mehreren Klassen zu erstellen, anstatt sie durch das Schlüsselwort new instanziieren.

Wenn Sie $em->getRepository('EntityFQCN') nennen, Lehre (durch die repository_factory) für eine eventuelle Repository Klasse sieht in Ihrer Entity definiert (dh @ORM\RepositoryClass(...)) und eine Instanz davon zurückgeben, sonst, wenn es keine Repository-Klasse für das Unternehmen gefunden ist, es gibt eine Instanz des Standards EntityRepository mit der angegebenen Entität als Argument zurück (z. B. getRepository('EntityFQCN')).

Also, ohne den Link im Detail zu betrachten, ich denke, ich kann sagen, dass, wenn Sie versuchen, diese Alternative zu implementieren, Sie Ihr Repository über die "Standard" -Weise, d. H. EntityManager::getRepository('xxxx')10 abrufen.
Die Rolle dieses Konfigurationsteils besteht darin, das Repository anders als im Standard zu instanziieren.

Ich habe die RepositoryFactory bereits überschrieben, als ich den Standard EntityRepository überschreiben musste (eine Instanz einer benutzerdefinierten Repository-Klasse zurückgeben, ohne sie in meinen Entitäten zu definieren, dh die Standard-Repository-Klasse zu ersetzen). Sie können see it in action.

Hoffe, Sie haben eine Menge Spaß mit DI in Doctrine.

+0

Also nehme ich an, dass Mittel für jedes mögliche Repository, in das ich Abhängigkeiten injizieren möchte, eine ähnliche Klausel benötigen würde: if (is_subclass_of ($ entityNamespace, '\ App \ Util \ Doctrine \ Entity \ EntityInterface', true)) {'in dieser einzigen Datei. Ich würde auch alle meine 'use'-Anweisungen in einer einzigen Datei für jedes Repository haben müssen, in das ich Abhängigkeiten einfügen möchte. Ich denke, dass es modularer wäre, die erste Methode zu verwenden. Gibt es jemals einen Grund, eine Methode gegenüber der anderen zu verwenden? Oder ist es einfach Präferenz? –

Verwandte Themen