zend-frameworkzend-framework2zend-formzend-dbzend-framework3

Unable to resolve service "Zend\Db\Adapter\AdapterInterface" to a factory


I am a newbie to zf.I downloaded the album project from github and started working on it . I did all the configuration as been written in the tutorial . But i am getting this error continuously . Unable to resolve service "Zend\Db\Adapter\AdapterInterface" to a factory; are you certain you provided it during configuration?

I started looking for some solutions and found same issue posted in Stack Overflow and went through them but none of the solution worked for me . Below i am pasting the pages code , pls assist i am stuck here for 2 days now. I am working on my local system . I have windows 10 and xampp installed.

Module.php

<?php
namespace Album;

use Zend\Db\Adapter\Adapter;
use Zend\Db\Adapter\AdapterInterface;
use Zend\Db\ResultSet\ResultSet;
use Zend\Db\TableGateway\TableGateway;
use Zend\ModuleManager\Feature\ConfigProviderInterface;

class Module implements ConfigProviderInterface
{
    public function getConfig()
    {
        echo "Module.php";
        return include __DIR__ . '/config/module.config.php';
    }

    public function getServiceConfig()
    {
        return [
            'factories' => [
                Model\AlbumTable::class => function ($container) {
                    $tableGateway = $container->get('Model\AlbumTableGateway');
                    return new Model\AlbumTable($tableGateway);
                },
                'Model\AlbumTableGateway' => function ($container) {
                    $dbAdapter          = $container->get(AdapterInterface::class);
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new Model\Album());
                    return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
                },
            ],
        ];
    }

    public function getControllerConfig()
    {
        return [
            'factories' => [
                Controller\AlbumController::class => function ($container) {
                    return new Controller\AlbumController(
                        $container->get(Model\AlbumTable::class)
                    );
                },
            ],
        ];
    }
}

module.config.php

namespace Album;
use Zend\Router\Http\Segment;

return [
    'router' => [
        'routes' => [
            'album' => [
                'type'    => Segment::class,
                'options' => [
                    'route'       => '/album[/:action[/:id]]',
                    'constraints' => [
                        'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                        'id'     => '[0-9]+',
                    ],
                    'defaults'    => [
                        'controller' => Controller\AlbumController::class,
                        'action'     => 'index',
                    ],
                ],
            ],
        ],
    ],

    'view_manager' => [
        'template_path_stack' => [
            'album' => __DIR__ . '/../view',
        ],
    ],
];

composer.json

{
"name": "zendframework/skeleton-application",
"description": "Skeleton Application for Zend Framework zend-mvc applications",
"type": "project",
"license": "BSD-3-Clause",
"keywords": [
    "framework",
    "mvc",
    "zf"
],
"homepage": "http://framework.zend.com/",
"minimum-stability": "dev",
"prefer-stable": true,
"require": {
    "php": "^5.6 || ^7.0",
    "zendframework/zend-component-installer": "^1.0 || ^0.7 || ^1.0.0-dev@dev",
    "zendframework/zend-mvc": "^3.0.1",
    "zfcampus/zf-development-mode": "^3.0"
},
"autoload": {
    "psr-4": {
        "Application\\": "module/Application/src/",
        "Album\\": "module/Album/src/"
    }
},
"autoload-dev": {
    "psr-4": {
        "ApplicationTest\\": "module/Application/test/",
        "Album\\": "module/Album/src/"
    }
},
"extra": [],
"scripts": {
    "cs-check": "phpcs",
    "cs-fix": "phpcbf",
    "development-disable": "zf-development-mode disable",
    "development-enable": "zf-development-mode enable",
    "development-status": "zf-development-mode status",
    "post-create-project-cmd": [
        "@development-enable"
    ],
    "serve": "php -S 0.0.0.0:8080 -t public public/index.php",
    "test": "phpunit"
}
}

global.php

return array(
 'db' => array(
    'driver'   => 'Pdo',
    'adapters' => array(
        'default_db' => array(
            'driver'         => 'Pdo',
            'dsn'            => 'mysql:dbname=zf2tutorial;host=localhost',
            'username' => 'root',
            'password' => '',
            'driver_options' => array(
                PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' // optional
            ),
        ),
    ),
),
);

AlbumController.php

<?php
namespace Album\Controller;

use Album\Form\AlbumForm;
use Album\Model\Album;
use Album\Model\AlbumTable;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;


class AlbumController extends AbstractActionController
 {
 private $table;

public function __construct(AlbumTable $table)
{
    $this->table = $table;
}

public function indexAction()
{
    // Grab the paginator from the AlbumTable:
    $paginator = $this->table->fetchAll(true);

    // Set the current page to what has been passed in query string,
    // or to 1 if none is set, or the page is invalid:
    $page = (int) $this->params()->fromQuery('page', 1);
    $page = ($page < 1) ? 1 : $page;
    $paginator->setCurrentPageNumber($page);

    // Set the number of items per page to 10:
    $paginator->setItemCountPerPage(10);

    return new ViewModel(['paginator' => $paginator]);
}

public function addAction()
{
    $form = new AlbumForm();
    $form->get('submit')->setValue('Add');

    $request = $this->getRequest();

    if (!$request->isPost()) {
        return ['form' => $form];
    }

    $album = new Album();
    $form->setInputFilter($album->getInputFilter());
    $form->setData($request->getPost());

    if (!$form->isValid()) {
        return ['form' => $form];
    }

    $album->exchangeArray($form->getData());
    $this->table->saveAlbum($album);

    return $this->redirect()->toRoute('album');
}

public function editAction()
{
    $id = (int) $this->params()->fromRoute('id', 0);

    if (0 === $id) {
        return $this->redirect()->toRoute('album', ['action' => 'add']);
    }

    // Retrieve the album with the specified id. Doing so raises
    // an exception if the album is not found, which should result
    // in redirecting to the landing page.
    try {
        $album = $this->table->getAlbum($id);
    } catch (\Exception $e) {
        return $this->redirect()->toRoute('album', ['action' => 'index']);
    }

    $form = new AlbumForm();
    $form->bind($album);
    $form->get('submit')->setAttribute('value', 'Edit');

    $request  = $this->getRequest();
    $viewData = ['id' => $id, 'form' => $form];

    if (!$request->isPost()) {
        return $viewData;
    }

    $form->setInputFilter($album->getInputFilter());
    $form->setData($request->getPost());

    if (!$form->isValid()) {
        return $viewData;
    }

    $this->table->saveAlbum($album);

    // Redirect to album list
    return $this->redirect()->toRoute('album', ['action' => 'index']);
}

public function deleteAction()
{
    $id = (int) $this->params()->fromRoute('id', 0);
    if (!$id) {
        return $this->redirect()->toRoute('album');
    }

    $request = $this->getRequest();
    if ($request->isPost()) {
        $del = $request->getPost('del', 'No');

        if ($del == 'Yes') {
            $id = (int) $request->getPost('id');
            $this->table->deleteAlbum($id);
        }

        // Redirect to list of albums
        return $this->redirect()->toRoute('album');
    }

    return [
        'id'    => $id,
        'album' => $this->table->getAlbum($id),
    ];
}
}

Solution

  • configure your "config/autoload/local.php" Or "config/autoload/global.php",

    return array(
       'db' => array(
            'driver'   => 'Pdo',
            'adapters' => array(
                'default_db' => array(
                    'driver'         => 'Pdo',
                    'dsn'            => 'mysql:dbname=YOURDBNAME;host=localhost',
                    'username' => 'xxx',
                    'password' => 'xxx',
                    'driver_options' => array(
                        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' // optional
                    ),
                ),
            ),
        ),
       'service_manager' => array(
            'factories' => array(
                'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
            ),
            'abstract_factories' => array(
                'Zend\Db\Adapter\AdapterAbstractServiceFactory',
            ),
        ),
    
    );
    

    You can set your credential on "config/autoload/local.php".

    public function getServiceConfig()
        {
            return [
                'factories' => [
                    Model\AlbumTable::class => function ($container) {
                        $tableGateway = $container->get('Model\AlbumTableGateway');
                        return new Model\AlbumTable($tableGateway);
                    },
                    'Model\AlbumTableGateway' => function ($container) {
                        $dbAdapter          = $container->get('default_db'); // return driver instance
                        $resultSetPrototype = new ResultSet();
                        $resultSetPrototype->setArrayObjectPrototype(new Model\Album());
                        return new TableGateway('album', $dbAdapter, null, $resultSetPrototype);
                    },
                ],
            ];
        }
    

    In config/application.config.php,

    return array(   
        'modules' => array(          
            'Zend\Db', // make sure you have `'Zend\Db'` to top
    

    update your composer.json file as below,

    "require": {
        "php": "^5.6 || ^7.0",
        "zendframework/zend-component-installer": "^1.0 || ^0.7 || ^1.0.0-dev@dev",
        "zendframework/zend-mvc": "^3.0.1",
        "zfcampus/zf-development-mode": "^3.0",
        "zendframework/zendframework": "^3.0",
        "zendframework/zend-db": "^2.8.2",
    },
    

    for rendering update "module.config.php" with below,

    'view_manager' => array(
        'template_path_stack' => array(
            __DIR__ . '/../view',
        ),
    ),