Zend framework2 zend 2:试图通过';在local.php中指定备用数据库失败;适配器';钥匙
我正在尝试让一个特定的模块连接到另一个数据库。[我已经询问了][1]如何做到这一点,并获得了[此链接][2] 这并不十分复杂,但看起来我做错了什么,因为我看到了ServiceNotCreatedException 下面是我的config/autoload/local.php的样子:Zend framework2 zend 2:试图通过';在local.php中指定备用数据库失败;适配器';钥匙,zend-framework2,Zend Framework2,我正在尝试让一个特定的模块连接到另一个数据库。[我已经询问了][1]如何做到这一点,并获得了[此链接][2] 这并不十分复杂,但看起来我做错了什么,因为我看到了ServiceNotCreatedException 下面是我的config/autoload/local.php的样子: return array( 'db' => array( //Override global.php 'dsn' to specify local port on
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(
'Helpdesk\Model\TicketTable' => 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 Helpdesk\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Helpdesk\Model\Ticket;
class HelpdeskController extends AbstractActionController {
protected $ticketTable;
public function indexAction() {
return new ViewModel(array(
'tickets' => $this->getTicketTable()->fetchAll()
));
}
我使用TableGateway的方式与[zend tutorial][3]相同。
我正在这样做:
$dbAdapter = $sm->get('testdb');
与此相反:
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
我是不是误解了这一点
编辑:
以下是堆栈跟踪:
An exception was raised while creating "Helpdesk\Model\TicketTable"; no instance returned
App\vendor\zendframework\zendframework\library\Zend\Mvc\Controller\AbstractController.php(117): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
App\vendor\zendframework\zendframework\library\Zend\Mvc\DispatchListener.php(114): Zend\Mvc\Controller\AbstractController->dispatch(Object(Zend\Http\PhpEnvironment\Request), Object(Zend\Http\PhpEnvironment\Response))
[internal function]: Zend\Mvc\DispatchListener->onDispatch(Object(Zend\Mvc\MvcEvent))
App\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(468): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
App\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(207): Zend\EventManager\EventManager->triggerListeners('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
App\vendor\zendframework\zendframework\library\Zend\Mvc\Application.php(309): Zend\EventManager\EventManager->trigger('dispatch', Object(Zend\Mvc\MvcEvent), Object(Closure))
App\public\index.php(17): Zend\Mvc\Application->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 Mail\Factory;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class DbAdapter implements FactoryInterface{
public function createService(ServiceLocatorInterface $serviceLocator) {
$config = $serviceLocator->get('Config');
$adapter = new \Zend\Db\Adapter\Adapter($config['mail_db']);
return $adapter;
}
}
和工厂配置:
'service_manager' => array(
'factories' => array(
'mail_db_adapter' => 'Mail\Factory\DbAdapter',
),
),
如果你不知道如何解决这个问题,你可以这样做。错误与
Helpdesk\Model\ticketable
有关,而这不在你发布的Module.php代码中-你能编辑你的问题以包含它吗?我也不会混合和匹配DB配置的语法,所以在adapters数组中添加一个单独的条目,并将您的zf2tutorial移动到该数组中,guy建议这样做,以指定一个主\默认值,普通适配器类将拾取并在必须显式引用的“adapters”键下拥有辅助适配器。我还发现我有一些名字间隔的问题,这使问题变得混乱。很快我会重新编辑这篇文章,让它更清晰。是的,对不起,你说得很对,我只是重新阅读了这篇文章。所以你的方式很好。抽象工厂注册正确吗?当ServiceLocator无法直接找到任何服务时,它会尝试从抽象因素中获取一个实例。只需使用更多信息更新帖子。向上投票。我可能会求助于此,但我仍然想知道为什么它不能以“正确”的方式工作。我可能会在zend论坛上询问,如果我弄明白了,我可能会更新它。我不知道这个方法是否是最好的,或者通过多适配器配置+AbstractDbAdapterFactory。我认为抽象工厂实现降低了可读性,因为服务名称没有明确定义。