未创建服务异常:ZF2
Service Not Created Exception: ZF2
我正在完成面向初学者的 ZF2 深入教程,但在重新加载页面时我不断收到以下错误消息:
"执行过程中出现错误,请稍后重试。
附加信息:
Zend\ServiceManager\Exception\ServiceNotCreatedException
File:C:\xampp\htdocs\zend\vendor\zendframework\zendframework\library\Zend\ServiceManager\ServiceManager.php:946
Message:An 创建时出现异常 "Blog\Controller\List";没有实例 returned".
我已经到了准备数据库、添加映射器实现并更改 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()
));
}
}
?>
ListControllerFactory.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);
}
}
ZendDBSQLMapper.php - 设计为映射器 class 以执行对现有数据库的调用:
<?php
// Filename: /module/Blog/src/Blog/Mapper/ZendDbSqlMapper.php
namespace Blog\Mapper;
use Blog\Model\PostInterface;
use Zend\Db\Adapter\AdapterInterface;
class ZendDbSqlMapper implements PostMapperInterface
{
/**
* @var \Zend\Db\Adapter\AdapterInterface
*/
protected $dbAdapter;
/**
* @param AdapterInterface $dbAdapter
*/
public function __constrcut(AdapterInterface $dbAdapter)
{
$this->dbAdapter = $dbAdapter;
}
/**
* @param int|string $id
*
* @return PostInterface
* @throws \InvalidArgumentException
*/
public function find($id)
{
}
/**
* @return array|PostInterface[]
*/
public function findAll()
{
$sql = new Sql($this->dbAdapter);
$select = $sql->select('posts');
$stmt = $sql->prepareStatementForSqlObject($select);
$result = $stmt->execute();
\Zend\Debug\Debug::dump($result);die();
}
}
由于最后一行代码中有转储命令,结果变量的数据转储应该return类似:
object(Zend\Db\Adapter\Driver\Pdo\Result)#303 (8) {
["statementMode":protected] => string(7) "forward"
["resource":protected] => object(PDOStatement)#296 (1) {
["queryString"] => string(29) "SELECT `posts`.* FROM `posts`"
}
["options":protected] => NULL
["currentComplete":protected] => bool(false)
["currentData":protected] => NULL
["position":protected] => int(-1)
["generatedValue":protected] => string(1) "0"
["rowCount":protected] => NULL
}
但是我得到了如上所述的错误页面。
我发现了问题。本教程缺少此部分。
教程只说:
As you know from previous chapters, whenever we have a required
parameter we need to write a factory for the class. Go ahead and
create a factory for our mapper implementation.
您需要为 ZendDbSqlMapper 创建一个工厂:
创建/Blog/src/Blog/Factory/ZendDbSqlMapperFactory.php
<?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',
)
@kiwi Juicer 首先指出教程有两个问题。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()
);
}
}
然后打开module/Blog/conf/blog.conf.php
在原来的博客中。conf.php他们在分配 PostServiceFactory 的无效路径时遇到问题
'Blog\Service\PostServiceInterface' =>
'Blog\Service\Factory\PostServiceFactory',
找到并用正确的路径替换上面的行:
'Blog\Service\PostServiceInterface' =>
'Blog\Factory\PostServiceFactory',
我正在完成面向初学者的 ZF2 深入教程,但在重新加载页面时我不断收到以下错误消息:
"执行过程中出现错误,请稍后重试。
附加信息:
Zend\ServiceManager\Exception\ServiceNotCreatedException File:C:\xampp\htdocs\zend\vendor\zendframework\zendframework\library\Zend\ServiceManager\ServiceManager.php:946 Message:An 创建时出现异常 "Blog\Controller\List";没有实例 returned".
我已经到了准备数据库、添加映射器实现并更改 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()
));
}
}
?>
ListControllerFactory.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);
}
}
ZendDBSQLMapper.php - 设计为映射器 class 以执行对现有数据库的调用:
<?php
// Filename: /module/Blog/src/Blog/Mapper/ZendDbSqlMapper.php
namespace Blog\Mapper;
use Blog\Model\PostInterface;
use Zend\Db\Adapter\AdapterInterface;
class ZendDbSqlMapper implements PostMapperInterface
{
/**
* @var \Zend\Db\Adapter\AdapterInterface
*/
protected $dbAdapter;
/**
* @param AdapterInterface $dbAdapter
*/
public function __constrcut(AdapterInterface $dbAdapter)
{
$this->dbAdapter = $dbAdapter;
}
/**
* @param int|string $id
*
* @return PostInterface
* @throws \InvalidArgumentException
*/
public function find($id)
{
}
/**
* @return array|PostInterface[]
*/
public function findAll()
{
$sql = new Sql($this->dbAdapter);
$select = $sql->select('posts');
$stmt = $sql->prepareStatementForSqlObject($select);
$result = $stmt->execute();
\Zend\Debug\Debug::dump($result);die();
}
}
由于最后一行代码中有转储命令,结果变量的数据转储应该return类似:
object(Zend\Db\Adapter\Driver\Pdo\Result)#303 (8) {
["statementMode":protected] => string(7) "forward"
["resource":protected] => object(PDOStatement)#296 (1) {
["queryString"] => string(29) "SELECT `posts`.* FROM `posts`"
}
["options":protected] => NULL
["currentComplete":protected] => bool(false)
["currentData":protected] => NULL
["position":protected] => int(-1)
["generatedValue":protected] => string(1) "0"
["rowCount":protected] => NULL
}
但是我得到了如上所述的错误页面。
我发现了问题。本教程缺少此部分。
教程只说:
As you know from previous chapters, whenever we have a required parameter we need to write a factory for the class. Go ahead and create a factory for our mapper implementation.
您需要为 ZendDbSqlMapper 创建一个工厂: 创建/Blog/src/Blog/Factory/ZendDbSqlMapperFactory.php
<?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',
)
@kiwi Juicer 首先指出教程有两个问题。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()
);
}
}
然后打开module/Blog/conf/blog.conf.php
在原来的博客中。conf.php他们在分配 PostServiceFactory 的无效路径时遇到问题
'Blog\Service\PostServiceInterface' => 'Blog\Service\Factory\PostServiceFactory',
找到并用正确的路径替换上面的行:
'Blog\Service\PostServiceInterface' => 'Blog\Factory\PostServiceFactory',