第一次面对这样的问题...尝试在 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);
}
我认为有将静态适配器集成到应用程序中的最佳方法,以便将来轻松获得它。