8

在过去的几周里,我一直在关注 ZF2,尤其是Rob Allen 的“Album”示例,我创建了示例 DB-'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'"
        ),
    ),
);

模块.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 中的这篇文章类似。

它抛出的错误是: 附加信息:Zend\ServiceManager\Exception\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 教程,但仍然遇到这个问题。如果有人有解决方案,请与我们分享。

谢谢

4

9 回答 9

6

好像有人忘记更新 zf2 中的最新更改。

解决方案:

文件 module/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()
于 2012-07-27T22:31:45.897 回答
2

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

rename getServiceConfiguration() to getServiceConfig()

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

class Module implements ServiceProviderInterface
于 2012-10-27T23:18:12.877 回答
1

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

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',
        ),
    ),
);
于 2012-10-27T00:27:20.810 回答
1

在尝试按照 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';
}
于 2016-04-05T05:59:19.503 回答
0

Just got the same issue.

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

In my case the problem was, that PHPUnit could not find the key Cache\Model\UniversityStorage in the service manager (registry) because it's being added in the Module class of the Cache module and the Cache module was missing in the PHPUnit config file and was also not being loaded:

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

I've added the Cache module to the module list. Now it works.

于 2013-05-08T16:09:39.213 回答
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',
    ),
);

如果您想了解更多详细信息,请参阅链接 1链接 2

于 2013-04-19T06:07:59.530 回答
0

问题是在 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');
于 2013-05-14T13:14:57.773 回答
0

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

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

请参阅 Zend 创建的上述命名空间vendor/zendframework/zendframework/library/Zend/Filter/FilterPluginManager.php

于 2015-05-13T21:28:44.713 回答
0

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

“专辑\”:“模块/专辑/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/"
    }
},

在此之后运行“作曲家更新”并重新加载页面。检查错误是否消失。

于 2016-11-21T15:35:21.000 回答