模块getServiceConfig没有将TableGateway注入存储库

时间:2015-02-05 00:33:39

标签: php zend-framework2

我似乎无法将我的表网关注入我的存储库(服务)......

我有以下内容:

Module.php:

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

    public function getServiceConfig()
    {
        return array(
            'factories' => array(
                'Album\Model\Concrete\AlbumRepository' =>  function($sm) {
                    $tableGateway = $sm->get('AlbumTableGateway');
                    $table = new AlbumRepository($tableGateway);
                    return $table;
                },
                'AlbumTableGateway' => function ($sm) {
                    $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $resultSetPrototype = new ResultSet();
                    $resultSetPrototype->setArrayObjectPrototype(new Album());
                    return new TableGateway('albums', $dbAdapter, null, $resultSetPrototype);
                }
            )
        );
    }

这是我的 module.config.php:

return array(
    'service_manager' => array(
         'invokables' => array(
             'Album\Model\Abstracts\IAlbumRepository' => 'Album\Model\Concrete\AlbumRepository'
         ),
     ),

     'controllers' => array(
         'factories' => array(
             'Album\Controller\Album' => 'Album\Model\Factories\AlbumControllerFactory',
         ),
     ),

错误是:

Catchable fatal error: Argument 1 passed to Album\Model\Concrete\AlbumRepository::__construct() must be an instance of Zend\Db\TableGateway\TableGateway, none given, called in C:\xampp\htdocs\ZendFrameworkTest\vendor\zendframework\zendframework\library\Zend\ServiceManager\ServiceManager.php on line 1035 and defined in C:\xampp\htdocs\ZendFrameworkTest\module\Album\src\Album\Model\Concrete\AlbumRepository.php on line 11

注意:

工厂阵列上的委托功能只是没有被调用,我做了一些愚蠢的事,但我无法说出什么。

我也正在进行依赖注入,我猜这是因为工厂在没有注入的情况下创建存储库对象而出现问题:

class AlbumControllerFactory implements FactoryInterface
{
    /**
     * Create service
     *
     * @param ServiceLocatorInterface $serviceLocator
     *
     * @return mixed
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        // Need to do something here?
        $realServiceLocator = $serviceLocator->getServiceLocator();
        $postService        = $realServiceLocator->get('Album\Model\Abstracts\IAlbumRepository');

        return new AlbumController($postService);
    }
}

1 个答案:

答案 0 :(得分:1)

您将存储库定义为可调用,这意味着服务管理器尝试通过直接实例化而不使用任何参数来创建它。

将其更改为别名

return array(
    'service_manager' => array(
         'aliases' => array(
             'Album\Model\Abstracts\IAlbumRepository' => 'Album\Model\Concrete\AlbumRepository'
         ),
     ),
);