У меня проблема с примером Abstract Factories .
Я получаю ServiceNotFoundException
при создании класса с абстрактной фабрикой, зарегистрированной в ServiceManager.
Сначала я загружаю zend-servicemanager с помощью composer
composer require zendframework/zend-servicemanager
Затем запускаюПример ServiceManager в одном файле (для простоты).
<?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.
class A
{
public $text;
public function __construct()
{
$this->text = "Default text";
}
}
Я использую MyAbstractFactory из документации.
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 с зарегистрированной абстрактной фабрикой.
$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.
$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?
с трассировкой стека
.\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