【发布时间】:2016-10-13 10:16:38
【问题描述】:
我正在尝试通过自定义插件管理器(而不是服务管理器)在 ZF2 中使用Lazy Services。
插件管理器如下所示。
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__
));
}
}
根据文档;我已将服务“UserService”配置为通过此插件管理器延迟加载。
'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'
],
],
问题在于 LazyServiceFactory 已注册到 ServiceManager,因此在通过 $entityServiceManager->get('Spectrum\\User\\Entity\\User') 请求服务时无法找到。
错误是:
可捕获的致命错误:传递给 Zend\ServiceManager\Proxy\LazyServiceFactory::__construct() 的参数 1 必须是 ProxyManager\Factory\LazyLoadingValueHolderFactory 的实例,没有给出
这是因为插件管理器会将工厂创建为可调用的,而不是通过注册的LazyServiceFactoryFactory。
我尝试为插件管理器提供一个对等管理器,以允许它通过“父”服务管理器找到工厂。
`$entityServiceManager->addPeeringServiceManager($serviceManager);`
这允许找到工厂,但无法在validatePlugin() 方法中验证。
Zend\ServiceManager\Exception\RuntimeException' 带有消息'EntityServiceManager' 创建的服务必须是'EntityServiceInterface' 类型; 'EntityServiceManager::validatePlugin'中提供的'Zend\ServiceManager\Proxy\LazyServiceFactory'。'
如何向插件管理器注册惰性服务?
【问题讨论】:
-
@Ocramius ? :-p
标签: php zend-framework2