Php 未创建服务异常:ZF2

Php 未创建服务异常:ZF2,php,zend-framework,zend-framework2,Php,Zend Framework,Zend Framework2,我正在完成针对初学者的ZF2深入教程,在重新加载页面时,我不断收到以下错误消息: “执行过程中出错,请稍后再试 其他信息: Zend\ServiceManager\Exception\ServiceNotCreateDexException 文件:C:\xampp\htdocs\zend\vendor\zendframework\zendframework\library\zend\ServiceManager\ServiceManager.php:946 消息:创建“Blog\Controll

我正在完成针对初学者的ZF2深入教程,在重新加载页面时,我不断收到以下错误消息:

“执行过程中出错,请稍后再试

其他信息:

Zend\ServiceManager\Exception\ServiceNotCreateDexException 文件:C:\xampp\htdocs\zend\vendor\zendframework\zendframework\library\zend\ServiceManager\ServiceManager.php:946 消息:创建“Blog\Controller\List”时引发异常;未返回任何实例

在本教程中,我已经准备好了数据库,添加了mapper实现,并在module.config.php文件中修改了控制器管理器,使其支持工厂。我似乎看不出问题出在哪里。我的代码摘录如下:

module.config.php:

  // Tells our module where to find the view files. Can also overwrite view files for other modules.
  'view_manager' => array(
     'template_path_stack' => array(
         __DIR__ . '/../view'
         ),
     ),
           // Tells our module where to find the controller named Blog\Controller\List

  'controllers' => array(
     'factories' => array(
        'Blog\Controller\List' => 'Blog\Factory\ListControllerFactory'
         )
     ),
ListController.php:

    <?php
 // Filename: /module/Blog/src/Blog/Controller/ListController.php
 namespace Blog\Controller;

 use Blog\Service\PostServiceInterface;
 use Zend\Mvc\Controller\AbstractActionController;

 class ListController extends AbstractActionController
 {
     /**
      * @var \Blog\Service\PostServiceInterface
      */
     protected $postService;

     public function __construct(PostServiceInterface $postService)
     {
         $this->postService = $postService;
     }

    public function indexAction()
    {
        return new ViewModel(array(
            'posts' => $this->postService->findAllPosts()
            ));
    }

}

?>

但是,我得到了如上所述的错误页面。

我发现了问题。本教程缺少此部分

本教程仅说明:

正如你们从前面的章节中所知道的,每当我们有必要 参数我们需要为类编写一个工厂。继续 为映射器实现创建一个工厂

您需要为ZendDbSqlMapper创建工厂: 创建/Blog/src/Blog/Factory/ZendDbSqlMapperFactory.php

    <?php

namespace Blog\Factory;

use Blog\Controller\ListController;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class ListControllerFactory implements FactoryInterface
{
     /**
      * Create service
      *
      * @param ServiceLocatorInterface $serviceLocator
      *
      * @return mixed
      */

     public function createService(ServiceLocatorInterface $serviceLocator)
     {
        $realServiceLocator = $serviceLocator->getServiceLocator();
        $postService = $realServiceLocator->get('Blog\Service\PostServiceInterface');

          return new ListController($postService);
     }
}
<?php
// Filename: /Blog/src/Blog/Factory/ZendDbSqlMapperFactory.php
namespace Blog\Factory;

use Blog\Mapper\ZendDbSqlMapper;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class ZendDbSqlMapperFactory implements FactoryInterface
{
    /**
    * Create service
    *
    * @param ServiceLocatorInterface $serviceLocator
    *
    * @return mixed
    */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        return new ZendDbSqlMapper($serviceLocator->get('Zend\Db\Adapter\Adapter'));
    }
}

本教程有两个问题,第一个是@kiwi juice。。缺少ZendDbSqlMapperFactory.php

创建文件:/Blog/src/Blog/Factory/ZendDbSqlMapperFactory.php并填写以下内容:

    <?php// Filename: /module/Blog/src/Blog/Factory/ZendDbSqlMapperFactory.php

namespace Blog\Factory;

 use Blog\Mapper\ZendDbSqlMapper;
 use Blog\Model\Post;
 use Zend\ServiceManager\FactoryInterface;
 use Zend\ServiceManager\ServiceLocatorInterface;
 use Zend\Stdlib\Hydrator\ClassMethods;

 class ZendDbSqlMapperFactory implements FactoryInterface
 {
     /**
      * Create service
      *
      * @param ServiceLocatorInterface $serviceLocator
      *
      * @return mixed
      */
     public function createService(ServiceLocatorInterface $serviceLocator)
     {
         return new ZendDbSqlMapper(
             $serviceLocator->get('Zend\Db\Adapter\Adapter'),
             new ClassMethods(false),
             new Post()
         );
     }
 }

错误是因为ZF2无法创建控制器实例,所以请调查控制器工厂。您是否确定,
$postService=$realServiceLocator->get('Blog\Service\PostServiceInterface')
works?我也有同样的问题,并且发现错误发生在Svengali询问的行中:$postService=$realServiceLocator->get('Blog\Service\PostServiceInterface');但是,如果createService()函数中的任何位置或在此函数中调用的函数中的任何位置(例如:$options=new MyOptions($paramsConfig);)发生任何错误,则无法确定这将返回什么(不仅仅针对本例)。因此,你最好逐行浏览,找出问题的确切位置。请在你的答案上写下更多的评论,说明你认为问题是什么,以及为什么这样做应该有效谢谢。是的,这个答案确实有帮助!:)
<?php
// Filename: /Blog/src/Blog/Factory/ZendDbSqlMapperFactory.php
namespace Blog\Factory;

use Blog\Mapper\ZendDbSqlMapper;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class ZendDbSqlMapperFactory implements FactoryInterface
{
    /**
    * Create service
    *
    * @param ServiceLocatorInterface $serviceLocator
    *
    * @return mixed
    */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        return new ZendDbSqlMapper($serviceLocator->get('Zend\Db\Adapter\Adapter'));
    }
}
**and also use this one :**

'service_manager' => array(
    'factories' => array(
        'Blog\Mapper\PostMapperInterface'   => 'Blog\Factory\ZendDbSqlMapperFactory',
        'Blog\Service\PostServiceInterface' => 'Blog\Factory\PostServiceFactory',
        'Zend\Db\Adapter\Adapter'           => 'Zend\Db\Adapter\AdapterServiceFactory',
    )
    <?php// Filename: /module/Blog/src/Blog/Factory/ZendDbSqlMapperFactory.php

namespace Blog\Factory;

 use Blog\Mapper\ZendDbSqlMapper;
 use Blog\Model\Post;
 use Zend\ServiceManager\FactoryInterface;
 use Zend\ServiceManager\ServiceLocatorInterface;
 use Zend\Stdlib\Hydrator\ClassMethods;

 class ZendDbSqlMapperFactory implements FactoryInterface
 {
     /**
      * Create service
      *
      * @param ServiceLocatorInterface $serviceLocator
      *
      * @return mixed
      */
     public function createService(ServiceLocatorInterface $serviceLocator)
     {
         return new ZendDbSqlMapper(
             $serviceLocator->get('Zend\Db\Adapter\Adapter'),
             new ClassMethods(false),
             new Post()
         );
     }
 }