我正在尝试将特定模块连接到其他数据库。 [我已经问过] [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(
'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}
答案 0 :(得分:2)
我不确定你的方法,但我需要在我的项目中使用二级数据库,所以这就是我所做的:
config:
'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',
),
),
如果你无法弄清楚如何解决这个问题,你可以这样做。