我正在关注本教程但遇到错误Zend \ ServiceManager \ ServiceManager :: get无法为Zend \ Db \ Adapter \ Adapter
获取或创建实例 我正在使用谷歌搜索并尝试所有解决方案,但没有运气。请helppppp我很郁闷:|仅供参考:我正在使用这个骨架https://github.com/zendframework/ZendSkeletonApplication然后去。我没有安装zend。
module.php namespace Album;
// 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);
},
),
);
}
}
global.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 was unable to fetch or create an instance for getAlbumTableServiceNotFoundException in ZendFramework 2, example from Rob Allen
总是最终没有清晰度
答案 0 :(得分:3)
这是因为DB配置错误,为了解决这个问题,你必须在main config文件夹中的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',
),
),
);
答案 1 :(得分:1)
如果您在Ibm I系列服务器上遇到问题,这将有效。
问题的原因是IBMi无法处理配置中的相对路径。 我用以下
在我的机器上解决了它'config_glob_paths' => array( '/www/local/zf2/config/autoload/{,*.}{global,local}.php', ),
即将'config_glob_paths'设置为完整路径而不是application.config.php中的相对路径。
注意:如果您在本地收到错误,请检查配置文件。
答案 2 :(得分: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中保存我的用户名和密码信息。希望这能帮助你摆脱这个令人不安的错误。
答案 3 :(得分:0)
我刚刚在&#34; my_project / config / autoload / global.php&#34;中添加了以下代码。它运作得很好。
'service_manager' => array(
'factories' => array(
'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
),
我正在使用Oracle并让#34;用户名/密码&#34;在&#34; local.php&#34;。
谢谢!