0

Ich verwende mehr als eine Datenbank. Also habe ich diese Art der Konfiguration in meiner global.php Datei:So erhalten Sie die Konfiguration für Datenbankadapter

return [ 
'db' => [ 
    ... 
    ], 
    'adapters' => [ 
     'adapter1' => [ 
      ... 
      ] 
     ], 
     'adapter2' => [ 
      ... 
      ] 
     ] 
    ] 
] 
]; 

Und mein Ziel ist es, die Konfiguration aller meiner Adapter in einer Anweisung zu erhalten. Ich weiß nicht, ob es möglich ist. Es gibt diesen Befehl, um einen Adapter zu erhalten:

$sm->get('adapter1'); 

Aber ich mag so etwas haben:

$sm->get('adapters'); 

ich keine Lösung jetzt gefunden, so habe ich beschlossen, die Frage hier stellen ... ich nehme an, dies ist etwas möglich, da die Datei nur ein einfaches Array mit ...

Yours

EDIT:

Ich versuchte

$sm->get('config')['db']['adapters']; 

Aber es gibt ein Array von String. Eigentlich hätte ich gerne eine Reihe von Objekten. Objekte von Adapter. Auf die gleiche Weise erhalte ich einen Adapter auf diese Weise:

$sm->get('adapter1'); 

Yours

+1

Wenn Sie nur die config wollen: '$ adapter = $ sm-> get ('config') ['db'] ['adapter];'. Der Dienstschlüssel "config" gibt das zusammengefügte Konfigurationsarray der Anwendung zurück. – AlexP

+0

Danke ... Aber ich habe gerade gesehen, dass ich kein Array von String, sondern ein Array von Objekten möchte. Objekte von Adapter. Genauso wie ich ein Objekt mit '$ sm-> get ('adapter1');' – Renaud

+0

Erhalte keine wesentlichen zusätzlichen Informationen in Kommentare: bearbeite deinen Beitrag. Folgen Sie [Wie stelle ich eine gute Frage?] (Http://stackoverflow.com/help/how-to-ask). – greybeard

Antwort

0

Nicht sicher, ob dies ist, was Sie suchen, aber man könnte Zend\Config Klasse für diese.

// Create the object-oriented wrapper using the configuration data 
$adaptersConfig = $sm->get('config')['db']['adapters']; 
$adapters = new \Zend\Config($adaptersConfig); 

Jetzt können Sie Adapter zugreifen, wie Sie wollen: Sie können weitere Informationen zu dieser Klasse here in the documentation finden

$adapters->adapter1; 
+0

Hey, danke für deine Antwort. Ich habe versucht, aber das Ergebnis ist nicht das gleiche ich will. Die neue Zend \ Config \ Config-Klasse erstellt nicht das Objekt, das ich erwartet habe. Ich habe vielleicht eine andere Lösung gefunden ... Ich arbeite daran. – Renaud

+0

@Renaud, also was erwartest du dann zu bekommen? Möchten Sie die tatsächlichen Adapter anstelle der Konfig für die Adapter? – Wilt

0

Wenn Sie eine Sammlung des Adapters Objekte Sie dieses Modell könnte als ein Service, den Sie beim Service Manager registrieren.

Dieser Dienst ist einfach eine Sammelklasse, genannt DbAdapterCollection. Jedes Adapterobjekt wird gespeichert und durch seinen Namen referenziert.

class DbAdapterCollection 
{ 
    protected $adapters = []; 

    public function __construct(array $adapters = []) 
    { 
     $this->setAdapters($adapters); 
    } 

    public function hasAdapter($name) 
    { 
     return isset($this->adapters[$name]); 
    } 

    public function getAdapters() 
    { 
     return $this->adapters; 
    } 

    public function setAdapters(array $adapters) 
    { 
     $this->adapters = []; 

     foreach ($adapters as $name => $adapter) { 
      $this->setAdapter($name, $adapter); 
     } 
    } 

    public function getAdapter($name) 
    { 
     if (! $this->hasAdapter($name)) { 
      throw new \RuntimeException('An adapter with the name \'' . $name . '\' could not be found.'); 
     } 
     return $this->adapters[$name]; 
    } 

    public function addAdapter($name, \Zend\Db\Adapter $adapter) 
    { 
     $this->adapters[$name] = $adapter; 
    } 
} 

Um diese Klasse mit den Adapter bevölkern Objekte Sie eine Service-Fabrik können sie in der Klasse __construct zu injizieren. Wir können den Service Manager verwenden, um auch die erforderliche Konfiguration zu laden, damit wir wissen, welche Adapter dem Erfassungsdienst hinzugefügt werden sollen.

class DbAdapterCollectionFactory 
{ 
    public function __invoke(ServiceManager $serviceManager, $name, $requestedName) 
    { 
     $config = $serviceManager->get('config'); 

     $options = []; 
     $adapters = []; 

     if (isset($config['my_app']['services'][$requestedName])) { 
      $options = $config['my_app']['services'][$requestedName]; 
     } 

     if (! empty($options['adapters']) && is_array($options['adapters'])) { 
      foreach ($options['adapters'] as $name => $adapter) { 
       if (is_string($adapter) && $serviceManager->has($adapter)) { 
        $adapter = $serviceManager->get($adapter); 
       }  
       if ($adapter instanceof \Zend\Db\Adapter) { 
        $adapters[$name] = $adapter; 
       } 
      } 
     } 

     return new DbAdapterCollection($adapters); 
    } 
} 

Die Konfiguration für dieses Beispiel könnte so aussehen.

'service_manager' => [ 
    'factories' => [ 
     'DbAdapterCollection' => 'MyApp\\Db\\DbAdapterCollectionFactory' 
    ], 
], 

// Example app config 
'my_app' => [ 
    'services' => [ 
     'DbAdapterCollection' => [ 
      // adapterName => dbServiceName, 
      'adapters' => [ 
       'adapter1' => 'MyApp\\Db\\Adapter1' 
       'adapter2' => 'adapter2' 
       'adapter3' => 'adapter3' 
      ], 
     ] 
    ], 
], 

Alles, was Sie dann brauchen, ist, den Service vom Service Manager anzurufen.

+0

Netter Weg, aber ich fand eine bessere geeignete Lösung. (In der Methode getServiceConfig() in der Klasse Module füge ich einfach einen Index ein, der ein Array meiner Adapter zurückgibt. – Renaud

Verwandte Themen