Ein einfacher Weg (es gibt immer mehrere Wege in ZF2) eine globale Datenbank Connection zur Verfügung zu erstellen, ist der hier beschriebene Weg über Zend\Db\Adapter\Adapter, der Zend/Db/Adapter/AdapterServiceFactory und dem ServiceManager!

In der config/global.php erweitern wir das Konfigurations Array um folgende Einträge, um die Verbindungsdetails zu unserer Datenbank anzugeben:

'db' => array(
    		'driver'         => 'Pdo',
    		'dsn'            => 'mysql:dbname=zfplayground;host=localhost',
    		'driver_options' => array(
    				PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    		),
            'username' => 'root',
            'password' => '',
    ),

Der Zugriff auf die Datenbank geschieht in Zend Framework 2 über den Zend\Db\Adapter\Adapter, welcher mit den oben definierten Parametern initialisiert werden kann.
Um diese Konfigurationen nicht bei jedem Datenbank Zugriff erneut dem Adapter übermitteln zu müssen, können wir den ServiceManager mit Hilfe einer Factory damit beauftragen, einen Zend\Db\Adapter\Adapter mit den gegebenen Konfigurationen zu erstellen.

Glücklicherweise bringt das Framework bereits eine fertige Factory Zend\Db\Adapter\AdapterServiceFactory mit, welche die von uns definierten Parameter auswerten kann.
Man findet diese in vendor/zendframework/zendframework/library/Zend/Db/Adapter/AdapterServiceFactory.php

class AdapterServiceFactory implements FactoryInterface
{
    /**
     * Create db adapter service
     *
     * @param ServiceLocatorInterface $serviceLocator
     * @return Adapter
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $config = $serviceLocator->get('Config');
        return new Adapter($config['db']);
    }
}

Hier sehen wir, wie ein Adapter mit unseren Konfigurationen erstellt wird. Wichtig ist hier, dass unsere Konfigurationen unter dem Parameter “db” abgelegt werden.

Damit diese Factory jedoch auch verwendet wird (das Framework stellt diese lediglich zur Verfügung) müssen wir unseren ServiceManager konfigurieren eben diese Factory zu verwenden.
Dies könnte zum Beispiel in der config\autoload\global.php definiert werden:

'service_manager' => array(
    'factories' => array(
        'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
    ),
),

Nun lässt sich über den ServiceManager an jeder beliebigen Stelle in der Anwendung eine Adapter Instanz anfordern, welche bereits eine Verbindung zu Datenbank besitzt:
Zum Beispiel in einer Controller Action:

$adapter = $this->getServiceLocator()->get('Zend\Db\Adapter\Adapter');
Categories: Zend Framework 2