简体   繁体   中英

zf2 - Unable to resolve service Zend\Db\Adapter\Adapter to a factory

Why i'm getting this error even i have added all the classes already?

Unable to resolve service "Zend\\Db\\Adapter\\Adapter" to a factory; are you certain you provided it during configuration?

Here is my Module.php:

namespace Album;

use Album\Model\Album; 
use Album\Model\AlbumTable; 
use Zend\Db\ResultSet\ResultSet; 
use Zend\Db\TableGateway\TableGateway;

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 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);
                 },
             ),
         );
    }   

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

UPDATED: FILES - application.config.php:

return [
    // Retrieve list of modules used in this application.
    'modules' => [
        'Zend\Router',
        'Zend\Validator',
        'Application',
        'Album',
        'Blog',
    ],

    // These are various options for the listeners attached to the ModuleManager
    'module_listener_options' => [
        'module_paths' => [
            './module',
            './vendor',
        ],
        'config_glob_paths' => [
            // realpath(__DIR__) . '/autoload/{{,*.}global,{,*.}local}.php',
            realpath(__DIR__) . '/autoload/{,*.}{global,local}.php',
        ],


        'config_cache_enabled' => false,

        // The key used to create the configuration cache file name.
        'config_cache_key' => 'application.config.cache',


        'module_map_cache_enabled' => false,

        // The key used to create the class map cache file name.
        'module_map_cache_key' => 'application.module.cache',

        // The path in which to cache merged configuration.
        'cache_dir' => 'data/cache/',


        // 'check_dependencies' => true,
    ],

];

You may have missed a step from the tutorial you are following.

in config/autoload/global.php add:

return array(
     'db' => array(
         'driver'         => 'Pdo',
         'dsn'            => 'mysql:dbname=zf2tutorial;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',
         ),
     ),
 );

Probaly because the $sm->get('Zend\\Db\\Adapter\\Adapter') is not a service but is a class to set up an Adapter and is not registered within the ServiceManager yet.

Create a factory which builds the Adapter class for you by injecting the Config into it. Then register this AdapterFactory , which returns your adapter, within your serviceConfig . Or you could use the default AdapterFactory of Zend, which uses the 'db' key within your configuration to setup the database adapter.

Registering the Adapter within your Application Module.php :

public function getServiceConfig()
{
    return [
        'factories' => [
            \Zend\Db\Adapter\Adapter::class => \Zend\Db\Adapter\AdapterServiceFactory::class,
        ]
        // rest of your configuration
    ];
}

See the documentation of ZF2 v2.4 - Setting up a database adapter

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM