2012-06-18 3 views
0

Я пытаюсь настроить новый веб-приложение для целей обучения с использованием новейших технологий: Apache 2.4, PHP 5.4 и PostgreSQL 9.1Zend Framework 2 не может создать PostgreSQL DB адаптер

Я выбрал для разработки с помощью Zend Framework 2.

в моем главном модуле я определил этот метод:

public function getServiceConfiguration() { 
    return array(
     'factories' => array(
      'adapter' => function ($sm) { 
       $config = $sm->get('config'); 
       $adapter = new Adapter($config['db']); 

       return $adapter; 
      } 
     ), 
    ); 
} 

$ конфиг [ 'дб'] определяется в моей автозагрузку/global.php, который содержит:

return array(
    'db' => array(
     'driver' => 'PDO', 
     'dsn' => 'pgsql:host=localhost;port=5436;user=root;password=myrootpwd', 
    ) 
); 

, но когда я пытаюсь вызвать $ serviceManager-> Get ('адаптер') я получаю исключение, говоря:

Fatal error: Uncaught exception 'Zend\Db\Adapter\Exception\InvalidArgumentException' with message 'The supplied or instantiated driver object does not implement Zend\Db\Adapter\Driver\DriverInterface' in C:\Program Files\626Suite\application\library\Zend\ServiceManager\ServiceManager.php on line 294

Zend\Db\Adapter\Exception\InvalidArgumentException: The supplied or instantiated driver object does not implement Zend\Db\Adapter\Driver\DriverInterface in C:\Program Files\626Suite\application\library\Zend\Db\Adapter\Adapter.php on line 80

Call Stack:
0.0015 121600 1. {main}() C:\Program Files\626Suite\application\data\script\install.php:0
0.5699 936080 2. Zend\ServiceManager\ServiceManager->get(string(7), ???) C:\Program Files\626Suite\application\data\script\install.php:7
0.5700 936440 3. Zend\ServiceManager\ServiceManager->create(array(2)) C:\Program Files\626Suite\application\library\Zend\ServiceManager\ServiceManager.php:277
0.5701 936520 4. Zend\ServiceManager\ServiceManager->createServiceViaCallback(class Closure, string(7), string(7)) C:\Program Files\626Suite\application\library\Zend\ServiceManager\ServiceManager.php:353
0.5701 936672 5. call_user_func(class Closure, class Zend\ServiceManager\ServiceManager, string(7), string(7)) C:\Program Files\626Suite\application\library\Zend\ServiceManager\ServiceManager.php:543
0.5701 936696 6. Age\Module->Age{closure}(class Zend\ServiceManager\ServiceManager, string(7), string(7)) C:\Program Files\626Suite\application\library\Zend\ServiceManager\ServiceManager.php:543
0.6047 1024184 7. Zend\Db\Adapter\Adapter->__construct(class Zend\Config\Config, ???, ???) C:\Program Files\626Suite\application\module\Age\Module.php:43

EDIT:

Я попытался изменить фабрику как:

public function getServiceConfiguration() { 
    return array(
     'factories' => array(
      'adapter' => function ($sm) { 
       $config = $sm->get('config'); 
       $PDO = new \PDO($config['db']['dsn']); 
       $adapter = new Adapter($PDO); 

       return $adapter; 
      } 
     ), 
    ); 
} 

И я первым получил ошибку о том, что база данных «корень» не существует, но после изменения моей конфигурации в:

return array(
    'db' => array(
     'driver' => 'PDO', 
     'dsn' => 'pgsql:host=localhost;port=5436;dbname=postgres;user=root;password=myrootpwd', 
    ) 
); 

Я вернулся, чтобы получить исключение, о котором я говорил ранее.

+0

К слову: я никогда раньше не использовал PDO, я перехожу к нему непосредственно из простого старого mysql_query(), но AFAIK, после проверки документов PHP, строка DSN должна быть правильной. –

+0

Да, это как это делается http://www.php.net/manual/en/ref.pdo-pgsql.connection.php – michaelbn

ответ

1

В конце концов, я тоже смог решить эту проблему.

Решение состояло в том, чтобы обновить текущую версию Zend Framework 2 от бета-версии 4 до последней версии, загружаемой непосредственно из github.

Я предполагаю, что возникла проблема где-то в коде Zend, так как теперь она работает нормально, ничего не изменив в моем коде или в моих настройках.

5

следующие работы для меня:

/config/autoload/database.global.php

return array(
'db' => array(
    'driver' => 'Pdo', 
    'dsn'  => "pgsql:host=127.0.0.1;dbname=mydb", 
    'username' => 'username', 
    'password' => 'mypass', 
), 
); 

/module/Application/Module.php

public function getServiceConfiguration() 
{ 
    return array(
     'factories' => array(
      'db_adapter' => function($sm) { 
       $config = $sm->get('Configuration'); 
       $dbAdapter = new \Zend\Db\Adapter\Adapter($config['db']); 
       return $dbAdapter; 
      } 
     ), 
    ); 
} 

Затем вы можете использовать это примерно так:

$sql = "SELECT * FROM table WHERE field=?"; 
$statement = $this->adapter->query($sql); 
$res = $statement->execute(array($var)); 
+0

Я вижу, что вы отделили DSN от имени пользователя и пароля, не следует ли размещать их в DSN также? В любом случае, я попробую ваше решение как можно скорее. –

Смежные вопросы