zend 2:尝试通过'adapter'键在本地.php指定备用数据库而不成功



我正在尝试让一个特定的模块连接到另一个数据库。[我已经问过][1]如何做到这一点,并得到了[此链接][2]。

这并不是很复杂,但看起来我做错了什么,因为我看到了ServiceNotCreatedException。

以下是我的config/autoload/local.php的样子:

return array(
'db' => array(
//Override global.php 'dsn' to specify local port on dev box
'dsn' => 'mysql:dbname=zf2tutorial;host=localhost;port=3307',
'username' => 'root',
'password' => 'pass!',
'adapters' => array(
'testdb' => array(
'dsn' => 'mysql:dbname=otherdb;host=testsrv',
'username' => 'root',
'password' => 'pass',
)
)
),
);

Now here is what I have the module's Module.php:
public function getServiceConfig() {
return array(
'factories' => array(
'HelpdeskModelTicketTable' => function($sm) {
$tableGateway = $sm->get('TicketTableGateway');
$table = new TicketTable($tableGateway);
return $table;
},
'TicketTableGateway' => function($sm) {
$dbAdapter = $sm->get('testdb');
$resultSetPrototype = new ResultSet();
$resultSetPrototype->setArrayObjectPrototype(
new Ticket());
return new TableGateway('ticket', $dbAdapter, null,
$resultSetPrototype);
},
),
);
}

以下是控制器中的方法:

namespace HelpdeskController;
use ZendMvcControllerAbstractActionController;
use ZendViewModelViewModel;
use HelpdeskModelTicket;
class HelpdeskController extends AbstractActionController {
protected $ticketTable;
public function indexAction() {
return new ViewModel(array(
'tickets' => $this->getTicketTable()->fetchAll()
));
}

我使用TableGateway的方式与[zend教程][3]相同。我在做这个:

$dbAdapter = $sm->get('testdb');

取而代之的是:

$dbAdapter = $sm->get('ZendDbAdapterAdapter');

我是不是误解了这种方法?

编辑:这是堆栈跟踪:

An exception was raised while creating "HelpdeskModelTicketTable"; no instance returned
AppvendorzendframeworkzendframeworklibraryZendMvcControllerAbstractController.php(117): ZendEventManagerEventManager->trigger('dispatch', Object(ZendMvcMvcEvent), Object(Closure))
AppvendorzendframeworkzendframeworklibraryZendMvcDispatchListener.php(114): ZendMvcControllerAbstractController->dispatch(Object(ZendHttpPhpEnvironmentRequest), Object(ZendHttpPhpEnvironmentResponse))
[internal function]: ZendMvcDispatchListener->onDispatch(Object(ZendMvcMvcEvent))
AppvendorzendframeworkzendframeworklibraryZendEventManagerEventManager.php(468): call_user_func(Array, Object(ZendMvcMvcEvent))
AppvendorzendframeworkzendframeworklibraryZendEventManagerEventManager.php(207): ZendEventManagerEventManager->triggerListeners('dispatch', Object(ZendMvcMvcEvent), Object(Closure))
AppvendorzendframeworkzendframeworklibraryZendMvcApplication.php(309): ZendEventManagerEventManager->trigger('dispatch', Object(ZendMvcMvcEvent), Object(Closure))
Apppublicindex.php(17): ZendMvcApplication->run()
{main}

我不确定你的方法,但我的项目中需要一个辅助数据库,所以我就是这么做的:

配置:

'mail_db' => array(
'driver' => 'Pdo_Mysql',
'database' => 'iptcms_mail',
'hostname' => 'localhost',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES 'UTF8''
),
'username' => 'root',
'password' => '',
),

工厂:

namespace MailFactory;
use ZendServiceManagerFactoryInterface;
use ZendServiceManagerServiceLocatorInterface;
class DbAdapter implements FactoryInterface{
public function createService(ServiceLocatorInterface $serviceLocator) {
$config = $serviceLocator->get('Config');
$adapter = new ZendDbAdapterAdapter($config['mail_db']);
return $adapter;
}
} 

和工厂配置:

'service_manager' => array(
'factories' => array(
'mail_db_adapter' => 'MailFactoryDbAdapter',
),
),

如果你不知道如何解决这个问题,你可以这样做。

最新更新