Lazy Services via Plugin Manager

I am trying to use Lazy Services in ZF2 through a custom plugin manager (not a service manager).

The plugin manager is as follows.

use Zend\ServiceManager\AbstractPluginManager;
use Zend\ServiceManager\Exception\RuntimeException;

class EntityServiceManager extends AbstractPluginManager
{
    protected $autoAddInvokableClass = false;

    public function validatePlugin($service)
    {
        if ($service instanceof EntityServiceInterface) {
            return;
        }

        throw new RuntimeException(sprintf(
            'Services created by \'%s\' must be of type \'%s\'; \'%s\' provided in \'%s\'.',
            get_called_class(),
            'EntityServiceInterface',
            (is_object($service) ? get_class($service) : gettype($service)),
            __METHOD__
        ));
    }
}

According to the documentation; I configured the "UserService" service for lazy loading through this plugin manager.

'service_manager' => [
    'factories' => [
        'Zend\\ServiceManager\\Proxy\\LazyServiceFactory'
            => 'Zend\\ServiceManager\\Proxy\\LazyServiceFactoryFactory',
    ],
],
'lazy_services' => [
    'class_map' => [
        'User\\Entity\\User' => 'User\\Service\\UserService',
    ],
],
'entity_service_manager' => [
    'delegators' => [
        'User\\Entity\\User' => [
            'Zend\\ServiceManager\\Proxy\\LazyServiceFactory',
        ],
    ],
    'factories' => [
        'User\\Entity\\User' => 'User\\Factory\\Service\\UserServiceFactory'
    ],
],

The problem is that it is LazyServiceFactoryregistered in the ServiceManager and therefore cannot be found if the request is requested through $entityServiceManager->get('Spectrum\\User\\Entity\\User').

Error:

Fatal error allowed: argument 1 passed to Zend \ ServiceManager \ Proxy \ LazyServiceFactory :: __ construct () must be an instance of ProxyManager \ Factory \ LazyLoadingValueHolderFactory, not a single one

, factory invokable, LazyServiceFactoryFactory.

, factory .

`$entityServiceManager->addPeeringServiceManager($serviceManager);`

factory, validatePlugin().

Zend\ServiceManager\Exception\RuntimeException ' ", " EntityServiceManager ", " EntityServiceInterface "; 'Zend\ServiceManager\Proxy\LazyServiceFactory' 'EntityServiceManager:: validatePlugin'. '

?

+4
1

, LazyServiceFactory factory , :

'entity_service_manager' => [
    'delegators' => [
        'User\\Entity\\User' => [
            'Zend\\ServiceManager\\Proxy\\LazyServiceFactory',
        ],
    ],
    'factories' => [
        'User\\Entity\\User' => 'User\\Factory\\Service\\UserServiceFactory',
        'Zend\\ServiceManager\\Proxy\\LazyServiceFactory' => function ($pluginManager) {
            return $pluginManager->getServiceLocator()->get('Zend\\ServiceManager\\Proxy\\LazyServiceFactory');
        }
    ],
],

, . , factory ( , ).

, LazyServiceFactory. :

1) , , validatePlugin . validatePlugin, LazyServiceFactory. , , .

2) , LazyServiceFactory factory, , LazyServiceFactory EntityServiceManager factory setService :

class YourPluginManagerFactory extends AbstractPluginManagerFactory
{
    const PLUGIN_MANAGER_CLASS = 'EntityServiceManager';

    public function __invoke(ContainerInterface $container, $name, array $options = null)
    {
        $instance = parent::__invoke($container, $name, $options);
        $lazyFactory = $container->get(LazyServiceFactory::class);
        $instance->setService(LazyServiceFactory::class, $lazyFactory);
    }
}

validatePlugin.

3) , , - constructor. , factory.

+1

Source: https://habr.com/ru/post/1657597/


All Articles