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

Zend framework2 ZendFramework 2中的ServiceNotFoundException,来自Rob Allen的示例,zend-framework2,Zend Framework2,在过去的几周里,我特别关注ZF2,我创建了示例数据库-“zf2tutorial”和示例表-“album”,当我使用php mysql时,它可以很好地获取所有项目,因此数据库中的数据存在问题 我的local.php如下所示 config.autoload/local.php: return array( 'db' => array ( 'driver' => "Pdo", 'dsn' => "m

在过去的几周里,我特别关注ZF2,我创建了示例数据库-“zf2tutorial”和示例表-“album”,当我使用php mysql时,它可以很好地获取所有项目,因此数据库中的数据存在问题

我的local.php如下所示 config.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 **module/Album/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;
                },
            ),
        );
    }  
}
我也学习了ZF2 Beta 5教程,但仍然遇到这个问题。如果有人有解决方案,请与我们分享


谢谢

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

解决方案:

文件module/Album/module.php必须包含以下内容:

<?php

namespace Album;

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

class Module implements ServiceProviderInterface


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

config.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',
        ),
    ),
);

公用函数getServiceConfiguration()不是正确的函数名

rename getServiceConfiguration() to getServiceConfig()
虽然不是强制性的,但是您应该将类模块声明为

class Module implements ServiceProviderInterface

使用以下代码修改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):


如果您想了解更多详细信息,请参阅或

刚刚收到相同的问题

Zend\ServiceManager\Exception\ServiceNotFoundException: Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for Cache\Model\UniversityStorage
在我的例子中,问题是,PHPUnit在服务管理器(注册表)中找不到键
Cache\Model\UniversityStorage
,因为它被添加到
Cache
模块的
Module
类中,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',
        ),
    ),
);

问题在于,在config/autoload/global.php中,服务名为“Zend\Db\Adapter\Adapter”,而在module/Album/module.php中,它正在搜索“Zend\Db\Adapter”(缺少其他\Adapter)

像这样在module/Album/module.php中添加缺少的“\Adapter”为我修复了它

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

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

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


请参见Zend在
vendor/zendframework/zendframework/library/Zend/Filter/FilterPluginManager.php上创建的上述名称空间

我在尝试按照Zend教程实现代码时遇到了相同的问题。主要原因是订单文件夹

module
    ModuleX
        config
        src
            ModuleX //may be you forget this one
                Controller
                Factory
                Model
                ...
        view
        Module.php
在Module.php中,getConfig()和getAutoloaderConfig()足以运行

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

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

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

“相册\:“模块/相册/src/”

在像这样的自动加载和自动加载开发部分,其中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”并重新加载页面。检查错误是否消失。

Zend已将所有配置标准化为配置
getServiceConfig()
确实正确!将框架文件更新为最新的主文件,即RC2,您不应该在其中找到任何配置:)我正在努力解决同一问题,并尝试以两种方式获取配置,包括将一个函数作为别名来调用另一个函数,但这没有帮助。添加use.Using getServiceConfig()也不是我的解决方案!现在ZF 2.1.3已经发布,因此
getServiceConfig()
是正确的。它只需要
ServiceProviderInterface
行。通过这样做,我得到了这个错误致命错误:Class Album\Module包含1个抽象方法,因此必须声明为抽象或实现其余方法(Zend\ModuleManager\Feature\ServiceProviderInterface::getServiceConfig)在第54行的D:\projects\zf2 tutorial\module\Album\module.php中,您是否找到了解决方案?我目前正为这个完全相同的问题而挣扎。@BrianKessler你找到了我仍然无法解决的解决方案了吗?(我今天在同一个教程中遇到了同样的问题。对我来说,将db和service_manager字典[教程要求我们在global.php中添加它们]移动到我的模块(Album/config)中module.config.php解决了这个问题。我正在努力解决这个问题,并且在我的global.php中已经有了这个代码;它似乎没有任何帮助。在这种情况下,我会说试试这个。我正在努力解决这个问题,并试图以两种方式获得配置,包括将一个函数作为别名来调用另一个函数,但它没有帮助。或者添加工具的id。
                'AlbumTableGateway' => function($sm) {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
module
    ModuleX
        config
        src
            ModuleX //may be you forget this one
                Controller
                Factory
                Model
                ...
        view
        Module.php
class Module implements AutoloaderProviderInterface, ConfigProviderInterface{
public function getAutoloaderConfig(){
    return array(
        'Zend\Loader\StandardAutoloader' => array(
            'namespaces' => array(
                __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
            ),
        ),
    );
}

public function getConfig(){
    return include __DIR__ . '/config/module.config.php';
}
"autoload": {
    "psr-4": {
        "Application\\": "module/Application/src/",
        "Album\\": "module/Album/src/"

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