Аймен Ахмед
Аймен Ахмед

Reputation: 555

get doctrine db config in zf2

I want to use doctrine db config to access to DBAL layer in doctrine, I have the following configuration in my doctrine db file config: database.local.php

return array(
  'doctrine' => array(
    'connection' => array(
      'orm_default' => array(
        'driverClass' => 'Doctrine\DBAL\Driver\PDOPgSql\Driver',
        'params' => array(
          'host'     => 'localhost',
          'port'     => '5432',
          'user'     => 'postgres',
          'password' => '123456',
          'dbname'   => 'test'
        )
      )
    )
  )
);

and in my controller IndexController.php

use Doctrine\DBAL\DriverManager;

public function testAction(){
   $conn = DriverManager::getConnection($params, $config);
}

I want to use db config above in the getConnection function, is this possible?

Upvotes: 2

Views: 1536

Answers (2)

blackbishop
blackbishop

Reputation: 32710

If you've a db configuration in your local.php, so why don't you access it through the EntityManager ? Just like this :

public function testAction(){

 $em = ->getServiceLocator()
       ->get('Doctrine\ORM\EntityManager');

 $conn = $em->getConnection();
}

If you want to get it through the DriverManager :

$config = new \Doctrine\DBAL\Configuration();

$connectionParams = array(
      'host'     => 'localhost',
      'port'     => '5432',
      'user'     => 'postgres',
      'password' => '123456',
      'dbname'   => 'test'
      'driver' => 'pdo_pgsql',
);

$conn = DriverManager::getConnection($connectionParams, $config);

EDIT :

You can also get directly an instance of Doctrine\DBAL\Connection using the Registered Service names provided by Doctrine with your actual db configuration :

$conn = $this->getServiceLocator()->get('doctrine.connection.orm_default');

As the DriverManager::getConnection() method, this will return a Doctrine\DBAL\Connection which wraps the underlying driver connection.

Upvotes: 2

Sure.

First of all you should use ServiceLocator

ServiceLocator are auto injected into classes that implements \Zend\ServiceManager\ServiceLocatorAwareInterface

AbstractActionController, of your zf2 controllers already implements this interface.

To use into a class (model by example) you should declare implements and two methods that are designed by interface, setServiceLocator and getServiceLocator.

<?php
    namespace Security\Repository;

    use Zend\ServiceManager\ServiceLocatorInterface;
    use Zend\ServiceManager\ServiceLocatorAwareInterface;

    class Repository implements ServiceLocatorAwareInterface
    {
        protected $serviceLocator;

        public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
        {
            $this->serviceLocator = $serviceLocator;
        }

        public function getServiceLocator()
        {
            return $this->serviceLocator;
        }
    }

Using ServiceLocator are easy to do anything on ZF2. Try To understand how it works to get the fully power of zf2.

$configArray = $this->getServiceLocator()->get('config');

$config = new \Doctrine\DBAL\Configuration();

$connectionParams = $configArray['doctrine']['connection']['orm_default']['params']

$conn = DriverManager::getConnection($connectionParams, $config);

Upvotes: 1

Related Questions