2016-08-04 15 views
0

Ich habe diese SituationWie Abhängigkeit mit Factory-Muster in Symfony2 injizieren

abstract class Importer { 

    const NW = 1; 

    public static function getInstance($type) 
    { 
     switch($type) 
     { 
      case(self::NW): 
      return new NWImporter(); 
      break; 
     } 
    } 

    protected function saveObject(myObject $myObject) 
    { 
     //here I need to use doctrine to save on mongodb 
    } 

    abstract function import($nid); 
} 

und

class NWImporter extends Importer 
{ 
    public function import($nid) 
    { 
     //do some staff, create myObject and call the parent method to save it 
     parent::saveObject($myObject); 
    } 
} 

und ich möchte, dass sie wie diese

$importer = Importer::getInstance(Importer::NW); 
$importer->import($nid); 

meine Frage ist, verwenden: Wie injiziere ich die Doktrin, die in der saveObject Methode verwendet werden soll?

dank

+0

Erklären Sie Ihre Klasse als Service vorbei Argument '@doctrine.orm.entity_manager:

abstract class Importer { const NW = 1; public static function getInstance($type, $doctrine) { switch($type) { case(self::NW): return new NWImporter($doctrine); break; } } protected function saveObject(myObject $myObject) { //here I need to use doctrine to save on mongodb } abstract function import($nid); } 

dann in Ihrem Controller sollten Sie, so etwas zu tun ' – DOZ

+0

können Sie ein Beispiel geben? Ich versuchte bereits mit Dienstleistungen – user3174311

+1

sehen unten @elkorchianas anwser :) – DOZ

Antwort

1

Sie benötigen Importeur als symfony-Dienst zu konfigurieren:

services: 
    test.common.exporter: 
     # put the name space of your class 
     class: Test\CommonBundle\NWImporter 
     arguments: [ "@doctrine" ] 

dann in NWImporter einen Konstruktor mit einem Parameter definieren, die die Lehre Instanz mit

public function __construct($doctrine) 
    { 
    $this->doctrine= $doctrine; 
    } 

haben Diese Lösung können Sie vermeiden, indem Sie eine Factory-Methode verwenden, wie symfony es für Sie tut, aber wenn Sie es behalten möchten, wenn Sie $importer = Importer::getInstance(Importer::NW); von Ihrem Controller anrufen Sie können die Lehre Argument in der Factory-Methode injizieren:

$doctrine = $this->container->get('doctrine'); 
$importer = Importer::getInstance(Importer::NW, $doctrine); 
$importer->import($nid); 
+0

Ich versuchte bereits aber ich erhielt einen Fehler, weil Importeur "neuen NWImporter() zurückgibt;" Ich erwarte, dass ich einen Parameter überlasse ... – user3174311

+0

Sie rufen NWImporter :: getInstance() von wo ist es von Ihrem Controller? –

+0

Ja möchte ich es von einem Controller aufrufen, und ich kann nicht importieren, da NWImporter Importeur erweitert, und noch einmal erwartet das Konstrukt einen Parameter ... – user3174311