1

我正在关注本教程,但收到错误 Zend\ServiceManager\ServiceManager::get is unable to fetch or create an instance for Zend\Db\Adapter\Adapter

我已经谷歌搜索并尝试了所有解决方案,但没有运气。请帮助pppp我很沮丧:|

仅供参考:我正在使用这个骨架https://github.com/zendframework/ZendSkeletonApplication去。我没有安装zend。

module.php 命名空间相册;

// Add these import statements:
use Album\Model\Album;
use Album\Model\AlbumTable;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\Tabl`enter code here`eGateway;

class Module
{
 public function getAutoloaderConfig()
 {
     return array(
         'Zend\Loader\ClassMapAutoloader' => array(
             __DIR__ . '/autoload_classmap.php',
         ),
         'Zend\Loader\StandardAutoloader' => array(
             'namespaces' => array(
                 __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
             ),
         ),
     );
 }

 public function getConfig()
 {
     return include __DIR__ . '/config/module.config.php';
 }

 public function getServiceConfig()
 {
     return array(
         'factories' => array(
             'Album\Model\AlbumTable' =>  function($sm) {
                 $tableGateway = $sm->get('AlbumTableGateway');
                 $table = new AlbumTable($tableGateway);
                 return $table;
             },
             'AlbumTableGateway' => function ($sm) {
                 $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                 $resultSetPrototype = new ResultSet();
                 $resultSetPrototype->setArrayObjectPrototype(new Album());
                 return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
             },
         ),
     );
 }

}

全局.php

return array(
 'db' => array(
     'driver'         => 'Pdo',
     'dsn'            => 'mysql:dbname=aaa;host=aaa',
     'driver_options' => array(
         PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
     ),
 ),
 'service_manager' => array(
     'factories' => array(
         'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
     ),
 ),

);

我阅读并尝试了这些: ZF2 - get 无法获取或创建 getAlbumTable 的实例

ZendFramework 2 中的 ServiceNotFoundException,来自 Rob Allen 的示例

总是以不明确的方式结束

4

4 回答 4

3

这是因为数据库配置错误,要解决这个问题,您必须在主配置文件夹中的 global.php 中配置数据库。代码如下,复制粘贴并更改数据库名称和密码,

return array(
    'db' => array(
        'driver'         => 'Pdo',
        'dsn'            => 'mysql:dbname=zf2tutorial;host=localhost',
        'driver_options' => array(
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
        ),
        'username'       => 'root',
        'password'       => ''
    ),
    'service_manager' => array(
        'factories' => array(
            'Zend\Db\Adapter\Adapter'
                    => 'Zend\Db\Adapter\AdapterServiceFactory',
        ),
    ),
);
于 2014-02-28T11:09:33.587 回答
1

如果您在 Ibm I 系列服务器上遇到问题,这将起作用。

问题的原因是 IBMi 无法处理配置中的相对路径。我用以下方法在我的机器上解决了它

'config_glob_paths' => array( '/www/local/zf2/config/autoload/{,*.}{global,local}.php', ),

即将'config_glob_paths' 设置为完整路径,而不是application.config.php 中的相对路径。

注意:如果您在本地收到错误,请检查配置文件。

于 2014-02-07T17:33:42.887 回答
1

问题在于 module.php 中的以下行

$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');

你的 global.php 中的 db 配置信息无法被你的程序识别。作为解决方案,您可以将您在 global.php 上编写的配置转移到 module.config.php。

我的 module.config.php 如下:

<?php
return array(
'controllers' => array(
    'invokables' => array(
        'Album\Controller\Album' => 'Album\Controller\AlbumController',
    ),
),

'db' => array(
    'driver'         => 'Pdo',
    'dsn'            => 'mysql:dbname=zend;host=localhost',
    'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
    ),
),

// The following section is new and should be added to your file
'router' => array(
    'routes' => array(
        'album' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '/album[/:action][/:id]',
                'constraints' => array(
                    'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'id'     => '[0-9]+',
                ),
                'defaults' => array(
                    'controller' => 'Album\Controller\Album',
                    'action'     => 'index',
                ),
            ),
        ),
    ),
),
'view_manager' => array(
    'template_path_stack' => array(
        'album' => __DIR__ . '/../view',
    ),
),
); 

我在 Module.php 下的 getServiceConfig() 如下:

 public function getServiceConfig()
  {
    return array(
        'factories' => array( 

            'db' => function($sm) {
                echo PHP_EOL . "SM db-adapter executed." . PHP_EOL;
                $config = $sm->get('config');
                $config = $config['db'];
                //print_r($config);
                //exit();
                $dbAdapter = new Adapter($config);
                return $dbAdapter;
            },
            'Album\Model\AlbumTable' =>  function($sm) {
                $tableGateway = $sm->get('AlbumTableGateway');
                $table = new AlbumTable($tableGateway);
                return $table;
            },
            'AlbumTableGateway' => function ($sm) {
                $dbAdapter = $sm->get('db');
                //print_r($dbAdapter);
                //exit();             
                $resultSetPrototype = new ResultSet();
                $resultSetPrototype->setArrayObjectPrototype(new Album());
                return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
            },
        ),
    );
}

之后一切正常。

注意:在我的情况下,由于某种原因,Zend2 没有读取 global.php。(我建议有人需要进一步研究)local.php 仍然被读取。所以我仍然将我的用户名和密码信息保存在 local.php 中。希望这将帮助您摆脱这个令人不安的错误。

于 2014-02-10T11:09:46.707 回答
0

我刚刚在“my_project / config / autoload / global.php”中添加了以下代码,它运行良好。

'service_manager' => array(
    'factories' => array(
        'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
    ),

我正在使用 Oracle 并在“local.php”中设置“用户名/密码”。

谢谢!

于 2015-01-28T14:01:22.163 回答