在静态注册表中找不到数据库适配器


No database adapter was found in the static registry

第一次面对这样的问题...尝试在 zf2 中获取静态适配器时:

$this->adapter = 'Zend'Db'TableGateway'Feature'GlobalAdapterFeature::getStaticAdapter();

。例如,在我的插件的构造函数中,我收到一个错误:

No database adapter was found in the static registry.

我的全局配置文件如下所示:

<?php
//config/global.php
return array(
    'db' => array(
        'driver'            => 'Pdo',
        'dsn'               => 'mysql:dbname=example-db;host=localhost',
        'driver_options'    => array(
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES "UTF8"'
        ),
    ),
    'service_manager' => array(
      'factories' => array(
         'Zend'Db'Adapter'Adapter' => function ($serviceManager) {
            $adapterFactory = new Zend'Db'Adapter'AdapterServiceFactory();
               $adapter = $adapterFactory->createService($serviceManager);
               // set static adapter
               'Zend'Db'TableGateway'Feature'GlobalAdapterFeature::setStaticAdapter($adapter);
               return $adapter;
         }
      ),
   ),
);

谁知道可能是什么问题?谢谢。

当您向服务管理器注册工厂时,您必须在创建实例之前请求它。这与Zend 1相比是一个很大的变化,Zend 1 为数据库适配器等主要组件提供了单例。这种方法的优点是可扩展性,这是 Zend 1 绊倒的地方。

您可以在任何可以访问服务定位器的位置获取适配器。例如,在控制器中,您可以执行以下操作:

$sl = $this->getServiceLocator();
$adapter = $sl->get('Zend'Db'Adapter'Adapter');

此问题已按如下方式解决:

    // module/Application/Module.php
    public function onBootstrap(MvcEvent $e)
    {
         $sm = $e->getApplication()->getServiceManager();
         $adapter = $sm->get('Zend'Db'Adapter'Adapter');
'Zend'Db'TableGateway'Feature'GlobalAdapterFeature::setStaticAdapter($adapter);
    }

我认为有将静态适配器集成到应用程序中的最佳方法,以便将来轻松获得它。