首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zend\ServiceManager\ServiceManager:get无法获取或创建getAlbumTable实例

Zend\ServiceManager\ServiceManager:get无法获取或创建getAlbumTable实例
EN

Stack Overflow用户
提问于 2017-03-07 08:31:09
回答 2查看 6.6K关注 0票数 4

我正在尝试修改和复制一个自定义模块,我已经设置了DB连接所包含的所有内容,但是在查看我的模块时得到了错误,如下所示:

代码语言:javascript
复制
Zend\ServiceManager\ServiceManager::get was unable to fetch or create an instance for getAlbumTable

下面是我的module.config文件:

代码语言:javascript
复制
return array(
 'controllers' => array(
     'invokables' => array(
         'Album\Controller\Album' => 'Album\Controller\AlbumController',
     ),
 ),


 // The following section is new and should be added to your file
 'router' => array(
     'routes' => array(
         'album' => array(
             'type'    => 'segment',
             'options' => array(
                 'route'    => '/album[/:action][/:id]',
                 'constraints' => array(
                     'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                     'id'     => '[0-9]+',
                 ),
                 'defaults' => array(
                     'controller' => 'Album\Controller\Album',
                     'action'     => 'index',
                 ),
             ),
         ),
     ),
 ),

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

下面是global.php中的数据库连接

代码语言:javascript
复制
return array(
'db' => array(
    'driver'         => 'Pdo',
    'dsn'            => 'mysql:dbname=stickynotes;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',
    ),
),
);

这里是服务配置的module.php代码:

代码语言:javascript
复制
 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);
             },
         ),
     );
 }

这里是获取相册的控制器:

代码语言:javascript
复制
   <?php 

   namespace Album\Controller;

   use Zend\Mvc\Controller\AbstractActionController;
   use Zend\View\Model\ViewModel;


   class AlbumController extends AbstractActionController
    {
     protected $_albumTable;

     public function indexAction()

      {
         return new ViewModel(array(

         'albums' => $this->getAlbumTable()->fetchAll(),

     ));         
      }

    }

    ?>

以下是数据库表的附件:数据库表视图

谁能让我知道我在哪里调试这个错误并修复这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-13 06:29:27

我刚刚解决了这个问题,在我的模块文件Module.php中添加了服务,现在它运行得很好:

代码语言:javascript
复制
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);
             },
         ),
     );
 }
票数 -1
EN

Stack Overflow用户

发布于 2017-03-10 10:41:31

当您调用$this->getAlbumTable() Zend时,查找控制器插件,但是没有这样的插件,所以它会抛出异常。

如果您想从service_manager访问任何类,就必须通过工厂注入它。

代码语言:javascript
复制
use Interop\Container\ContainerInterface;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use MyNamespace\Controller\AlbumController;

class AlbumControllerFactory implements FactoryInterface
{
    /**
     *
     * @param ContainerInterface $container
     * @param string $requestedName
     * @param null|array $options
     * @return AlbumController
     */
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        $class = $requestedName ? $requestedName : AlbumController::class;
        $albumTable = $container->get('Album\Model\AlbumTable'); // get service from service manager
        $controller = new $class($albumTable);

        return $controller;

    }
    /**
     * Provided for backwards compatibility; proxies to __invoke().
     *
     * @param ContainerInterface|ServiceLocatorInterface $container
     * @return AlbumController
     */
    public function createService(ServiceLocatorInterface $container)
    {
        return $this($container, AlbumController::class);
    }
}

module.config.php

代码语言:javascript
复制
'controllers' => array(
    'factories' => array(
        Controller\AlbumController::class => Factory\Controller\AlbumControllerFactory::class,
    ),
),

在您的控制器中:

代码语言:javascript
复制
   namespace Album\Controller;

   use Zend\Mvc\Controller\AbstractActionController;
   use Zend\View\Model\ViewModel;


class AlbumController extends AbstractActionController
{

     protected $_albumTable;

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

     public function indexAction()
     {
         return new ViewModel(array(
             'albums' => $this->_albumTable->fetchAll()

          ));         
     }
}

很简单,不是吗?:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42643523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档