Вопрос по zend-framework2 – ServiceNotFoundException в ZendFramework 2, пример от Роба Аллена

8

в течение последних нескольких недель я следил за ZF2 особенно Альбом Роба Аллена примерЯ создал пример DB- "zf2tutorial". и пример таблицы «альбом», которая отлично работает при извлечении всех элементов, когда я использую 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 ** модуль / Альбом / 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.

Ошибка, которую он выдает: Additional information: 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, но все еще сталкивался с этой проблемой. Если у кого-то есть решение, поделитесь с нами.

Спасибо

У меня была такая же проблема в этом же уроке сегодня. Для меня, перемещение словаря db и service_manager [учебник просит нас добавить их вglobal.php] к моему модулю(Album/config) module.config.php сделал свое дело. user1349663
Вы когда-нибудь находили решение для этого? Я в настоящее время борюсь с той же самой проблемой. Brian Kessler
У меня тоже такая же проблема! Ziyan Junaideen
@BrianKessler Вы нашли решение, я все еще застрял :( Fawad Ghafoor

Ваш Ответ

9   ответов
0

Проблема в том, что в config / autoload / global.php служба называется «Zend \ Db \ Adapter \ Adapter» находясь в модуле / Album / Module.php, он искал "Zend \ Db \ Adapter" (отсутствует дополнительный \ адаптер).

Добавление отсутствующего & quot; \ Adapter & quot; внутри module / Album / Module.php как это исправил это для меня.

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

Я допускаю ту же проблему, когда пытаюсь реализовать код, следуя Zend Tutorial. Основной причиной является папка заказа

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';
}
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()
Теперь, когда ZF 2.1.3 вышел,getServiceConfig() верно. Это просто нужноServiceProviderInterface линий.
Я борюсь с этой же проблемой и пытался получить конфигурацию обоими способами, в том числе сделать одну функцию просто псевдонимом для вызова другой, но это не помогло. Также не добавив использование.
При этом я получаю эту ошибку. Неустранимая ошибка: класс Album \ Module содержит 1 абстрактный метод и поэтому должен быть объявлен как абстрактный или реализовать оставшиеся методы (Zend \ ModuleManager \ Feature \ ServiceProviderInterface :: getServiceConfig) в D: \ projects \ zf2- учебник \ module \ Album \ Module.php в строке 54
Zend стандартизировал всю конфигурацию для конфигурации.getServiceConfig() действительно правильно! Обновите файлы Framework до последней версии, которая является RC2, вы не должны найти в ней ни одной конфигурации :)
Использование getServiceConfig () было решением для меня!
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 модуль иCache модуль отсутствовал в конфигурационном файле PHPUnit и также не загружался:

/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 модуль в список модулей. Теперь это работает.

2

публичная функция getServiceConfiguration () не является правильным именем функции

rename getServiceConfiguration() to getServiceConfig()

хотя это не обязательно, вы должны объявить класс Module как

class Module implements ServiceProviderInterface
Я борюсь с этой же проблемой и пытался получить конфигурацию обоими способами, в том числе сделать одну функцию просто псевдонимом для вызова другой, но это не помогло. Также не было добавления инструментов.
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',
    ),
);

Если вы хотите больше деталей, обратитесьlink1 или жеlink2

0

Если вы получаете похожую ошибку для разных модулей и код кажется правильным, добавьте запись в composer.json

& quot; Альбом \ & quot ;: & quot; модуль / Альбом / src / & quot;

в разделах 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/"
    }
},

после этого запустите «Обновление композитора» и перезагрузите страницу. проверьте, если ошибка исчезла.

1

Я не уверен, но попробуйте ввести код в

кон & # xFB01; 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',
        ),
    ),
);
В таком случае я бы сказал, попробуйте этот ..kdtips.co.nz/2012/10/13/zend-framework-2-database-interaction<,/span> – Kdecom Nov 13 '12 at 21:42
Я боролся с этой же проблемой, и у меня уже был этот код в моем global.php; это, похоже, не помогает.
0

Вmodule/Album/src/Album/Model/Album.phpиспользуйте вместо:

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

Смотрите вышеупомянутые пространства имен, созданные Zend вvendor/zendframework/zendframework/library/Zend/Filter/FilterPluginManager.php

Похожие вопросы