2016-04-10 2 views
0

In ZF2, ich habe eine Fabrik wie dieseZF2 instanziierenden Klassen von Fabriken MutableCreationOptionsTrait mit: die gleiche Instanz der Klasse erstellt, egal was

class SomeServiceFactory implements FactoryInterface, MutableCreationOptionsInterface 
{ 
    use MutableCreationOptionsTrait; 

    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $serviceManager = $serviceLocator->getServiceLocator(); 
     $formElementManager = $serviceManager->get('FormElementManager'); 

     if ($this->creationOptions == 'value1') { 
      return new SomeService(
       $formElementManager->get('Path\To\Form1'), 
       $serviceManager->get('Path\To\Mapper1'), 
       new Object1() 
      ); 
     } elseif ($this->creationOptions == 'value2') { 
      return new SomeService(
       $formElementManager->get('Path\To\Form2'), 
       $serviceManager->get('Path\to\Mapper2'), 
       new Object2() 
      ); 
     } 
    } 
} 

In der Controller Factory, erhalte ich mehrere Instanzen von SomeService basierend auf dem Optionswert bei der Objekterzeugung angehängt, wie

$service1 = $viewHelperManager->get('Path\To\SomeService', ['valueType' => 'value1']); 
$service2 = $viewHelperManager->get('Path\To\SomeService', ['valueType' => 'value2']); 

(diese Dienste sind View-Helfer mit ihren Abhängigkeiten). Das Problem ist, dass $service2 das exakt gleiche Objekt wie $service1 ist, während es andere Abhängigkeiten haben sollte Ich habe versucht, die Sache ein wenig zu studieren, und es scheint, dass die $creationOptions nicht aktualisiert werden, wenn $service2 zugewiesen wird, obwohl die valueType ist komplett anders.

Was ist los?

Antwort

0

Versehentlich in die Antwort in den Kommentaren gestoßen (@AlexP wenn Sie mich hören können, dank Kumpel!) An die folgende Frage:

https://stackoverflow.com/a/28205176/4685379

standardmäßig ZF2 Aktien der Dienste. Wenn Sie einen neuen Dienst jedes Mal, wenn die Fabrik rufen erstellen möchten, müssen Sie die shared Direktive in der module.confing.php unter dem entsprechenden Eintrag wie folgt spezifizieren:

'view_helpers' => [ 
    'factories' => [ 
     // some factories including the name of the one that 
     // you don't want to create new instances each time it's called 
    ], 
    'shared' => [ 
     'Alias\Of\That\Factory' => false, 
    ], 
], 

http://framework.zend.com/manual/current/en/modules/zend.service-manager.quick-start.html#sample-configuration