zend 2:不成功地尝试通过“adapter”键在local.php中指定备用数据库

时间:2014-03-03 18:53:43

标签: zend-framework2

我正在尝试将特定模块连接到其他数据库。 [我已经问过] [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}

1 个答案:

答案 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',
    ),
),

如果你无法弄清楚如何解决这个问题,你可以这样做。