Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zend framework2 zend 2:试图通过';在local.php中指定备用数据库失败;适配器';钥匙_Zend Framework2 - Fatal编程技术网

Zend framework2 zend 2:试图通过';在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

我正在尝试让一个特定的模块连接到另一个数据库。[我已经询问了][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}

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

配置:

'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。我认为抽象工厂实现降低了可读性,因为服务名称没有明确定义。