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

时间:2012-07-27 12:59:40

标签: zend-framework2

过去几周我一直在关注ZF2,尤其是 Rob Allen's 'Album' example ,我创建了示例DB-'zf2tutorial'和示例table-'album',当我使用php-时,它可以很好地获取所有项目mysql,所以DB中的数据出现问题。

我的local.php看起来像这样 的 CON组fi g.autoload / local.php:

return array(
    'db' => array
    (
        'driver'         => "Pdo",
        'dsn'            => "mysql:dbname=zf2tutorial;hostname=localhost",
        'username'       => "user", //here I added my valid username 
        'password'       => "password", //here I added my valid password 
        'driver_options' => array
        (
            PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"
        ),
    ),
);

Module.php **模块/专辑/ Model.php

<?php
namespace Album;

use Album\Model\AlbumTable;

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 getServiceConfiguration() 
    {
        return array(

            'factories' => array(

                'album-table' => function($sm) //also tried this 'Album\Model\AlbumTable' =>  function($sm)
                {
                    $dbAdapter = $sm->get('db-adapter');//also tried this $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $table = new AlbumTable($dbAdapter);
                    return $table;
                },
            ),
        );
    }  
}

我只是想检查一下zf2turorial / album是否有效它会在stackoverlow中抛出这个与this类似的错误。

它抛出的错误是: 其他信息: 的Zend \的ServiceManager \异常\ ServiceNotFoundException的

File:
..\vendor\zendframework\zendframework\library\Zend\ServiceManager\ServiceManager.php:392
Message:
Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Album\Model\AlbumTable

我也遵循了ZF2 Beta 5教程,但仍遇到此问题。如果有人有解决方案,请与我们分享。

由于

9 个答案:

答案 0 :(得分:6)

似乎有人忘记更新zf2中的最新更改。

解决方案:

文件模块/ Album / Module.php必须包含以下内容:

<?php

namespace Album;

use Album\Model\AlbumTable;
use Zend\ModuleManager\Feature\ServiceProviderInterface;

class Module implements ServiceProviderInterface

然后你必须重命名

public function getServiceConfig()

public function getServiceConfiguration()

答案 1 :(得分:2)

public function getServiceConfiguration()不是正确的函数名

rename getServiceConfiguration() to getServiceConfig()

虽然它不是强制性的,但您应该将类​​Module声明为

class Module implements ServiceProviderInterface

答案 2 :(得分:1)

我不确定但是尝试将代码放入

con fi g.autoload / global.php :就像这样

return array(
    'db' => array(

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

答案 3 :(得分:0)

使用以下代码修改config / autoload / global.php:

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

并且您应该将您的数据库凭据放在config / autoload / local.php中,以便它们不在git存储库中(因为local.php被忽略):

return array(
    'db' => array(
        'username' => 'YourDBUsername',
        'password' => 'YourDBPassword',
    ),
);

如果您想了解更多详情,请参阅link1link2

答案 4 :(得分:0)

刚刚遇到同样的问题。

Zend\ServiceManager\Exception\ServiceNotFoundException: Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Cache\Model\UniversityStorage

在我的情况下问题是,PHPUnit在服务管理器(注册表)中找不到密钥Cache\Model\UniversityStorage,因为它被添加到Module模块的Cache类中, PHPUnit配置文件中缺少Cache模块,但也没有加载:

<强> /module/Application/test/phpunit.config.php

<?php
return array(
    'modules' => array(
        'Application',
        'Cache', // <- was missing
    ),
    'module_listener_options' => array(
        'config_glob_paths'    => array(
            '../../../config/autoload/{,*.}{global,local}.php',
        ),
        'module_paths' => array(
            'module',
            'vendor',
        ),
    ),
);

我已将Cache模块添加到模块列表中。现在它有效。

答案 5 :(得分:0)

问题是在config / autoload / global.php中,该服务名为“Zend \ Db \ Adapter \ Adapter”,而在module / Album / Module.php中,它正在搜索“Zend \ Db \ Adapter”(缺少附加\适配器)。

在module / Album / Module.php中添加缺少的“\ Adapter”,就像这样修复了它。

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

答案 6 :(得分:0)

module/Album/src/Album/Model/Album.php中,请改为使用:

array('name' => 'striptags'), array('name' => 'stringtrim'),

请参阅Zend在vendor/zendframework/zendframework/library/Zend/Filter/FilterPluginManager.php

创建的上述命名空间

答案 7 :(得分:0)

我在尝试实现代码时遇到了同样的问题,请关注zend教程。主要原因是订单文件夹

<iframe>
在Module.php中的

,getConfig(),getAutoloaderConfig()足以运行

<img>

答案 8 :(得分:0)

如果你为不同的模块得到类似的错误,代码似乎正确,那么在composer.json中添加一个条目

“相册”:“module / Album / src /”

在autoload和autoload-dev部分中,其中Album是模块的名称

"autoload": {
    "psr-4": {
        "Application\\": "module/Application/src/",
        "Album\\": "module/Album/src/"

    }
},
"autoload-dev": {
    "psr-4": {
        "ApplicationTest\\": "module/Application/test/",
        "Album\\": "module/Album/src/"
    }
},

运行“composer update”后重新加载页面。检查错误是否消失。