首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZF3:创建一个在ServiceManager中注册了抽象工厂的类时的ServiceNotFoundException

ZF3:创建一个在ServiceManager中注册了抽象工厂的类时的ServiceNotFoundException
EN

Stack Overflow用户
提问于 2018-09-30 17:20:41
回答 1查看 414关注 0票数 0

我对抽象工厂示例有问题。

我在创建一个在ServiceManager中注册了抽象工厂的类时获得了ServiceManager。

首先,我下载和作曲家。

代码语言:javascript
复制
composer require zendframework/zend-servicemanager

然后,我在单个文件中运行ServiceManager示例(为了简单起见)。

代码语言:javascript
复制
<?php
require_once 'vendor/autoload.php';

use Interop\Container\ContainerInterface;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\Factory\InvokableFactory;
use Zend\ServiceManager\Factory\FactoryInterface;
use Zend\ServiceManager\Factory\AbstractFactoryInterface;

类,这些类应该使用ServiceManager获取。

代码语言:javascript
复制
class A
{
    public $text;

    public function __construct() 
    {
        $this->text = "Default text";
    }
}

我使用文档中的MyAbstractFactory。

代码语言:javascript
复制
class MyAbstractFactory implements AbstractFactoryInterface
{
  public function canCreate(ContainerInterface $container, $requestedName)
  {
    return in_array('Traversable', class_implements($requestedName), true);
  }

  public function __invoke(ContainerInterface $container, 
                           $requestedName,
                           array $options = null)
  {
    return $requestedName();
  }
}

我用注册抽象工厂创建ServiceManager。

代码语言:javascript
复制
$serviceManager = new ServiceManager([
    // Neither works    
  //'abstract_factories' => array('MyAbstractFactory')
  'abstract_factories' => array( new MyAbstractFactory() )
  //'abstract_factories' => array( MyAbstractFactory::class )
  /*  
    'abstract_factories' => [
        MyAbstractFactory::class => new MyAbstractFactory()
    ]
  */  
]);

最后,我试图获得A类的实例。

代码语言:javascript
复制
$a = $serviceManager->get(A::class);
var_dump($a);

我得到带有堆栈跟踪的Fatal error: Uncaught Zend\ServiceManager\Exception\ServiceNotFoundException: Unable to resolve service "A" to a factory; are you certain you provided it during configuration?

代码语言:javascript
复制
.\vendor\zendframework\zend-servicemanager\src\ServiceManager.php(763): Zend\ServiceManager\ServiceManager->getFactory('A') #1
.\vendor\zendframework\zend-servicemanager\src\ServiceManager.php(200): Zend\ServiceManager\ServiceManager->doCreate('A') #2
.\script.php(53): Zend\ServiceManager\ServiceManager->get('A') #3
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-02 06:36:32

我对这个问题的表述是错误的。@rkeet的评论表明了这一点。

由于我的目标是ServiceManager中抽象工厂注册的工作示例,所以我发布了一个单文件脚本,其中简化了canCreate(),以检查类是否存在。

代码语言:javascript
复制
<?php
// composer require zendframework/zend-servicemanager

require_once 'vendor/autoload.php';

use Interop\Container\ContainerInterface;
use Zend\ServiceManager\ServiceManager;
use Zend\ServiceManager\Factory\AbstractFactoryInterface;


class A
{
    public $text;

    public function __construct() 
    {
        $this->text = "Default text";
    }
}


class MyAbstractFactory implements AbstractFactoryInterface
{
    public function canCreate(ContainerInterface $container, $requestedName)
    {
        return class_exists($requestedName);
    }

    public function __invoke(ContainerInterface $container, 
                             $requestedName,
                             array $options = null)
    {
        return new $requestedName();
    }
}


$serviceManager = new ServiceManager([
  //'abstract_factories' => array('MyAbstractFactory') // works
  //'abstract_factories' => array( new MyAbstractFactory() ) // works
  'abstract_factories' => array( MyAbstractFactory::class ) // also works
]);


try {
    $a = $serviceManager->get(A::class);
    var_dump($a);
    echo "<br/>\n";
    $b = $serviceManager->get(B::class);
    var_dump($b);
} catch (Exception $e) {
    echo $e->getMessage() . "<br/>\n";
    echo "{$e->getFile()}  ({$e->getLine()})";
}
?>

正如@rkeet所指出的,如果有人需要使用最初的示例,类A应该实现可穿

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

https://stackoverflow.com/questions/52580302

复制
相关文章

相似问题

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