使用ZF2服务管理器覆盖实现

时间:2016-03-31 14:23:31

标签: php zend-framework2

假设在我的Zf2应用程序中,我有一个通过服务管理器检索的类A

'service_manager' => [
    'invokables' => [
        'A' => 'A'
    ]
]

如果,每次我检索课程A时,我都希望返回B的装饰工A,我可以使用委托工厂。

现在,只要我从服务管理器中检索它们,我想用这种方式装饰所有实现接口I的类?初始化程序似乎没有帮助,因为它们无法替代从服务管理器检索到的实现。

有办法做到这一点吗?任何建议都非常感谢

1 个答案:

答案 0 :(得分:0)

您可以创建一个自定义插件管理器,负责创建I类型的服务。

这将允许您为每个服务(或抽象工厂)注册自定义工厂,并仍然装饰向服务管理器注册的原始服务。

以下配置可能有助于解释。

return [
    'service_manager' => [
        'invokables' => [
            'A' => 'A',
            'B' => 'B',
        ]
    ],
    'foo_plugin_manager' => [
        'factories' => [
            'B' => 'FactoryB'
        ],
        'abstract_factories' => [
            'AbstractFactoryThatDecoratesAll',
        ]
    ],
];

此方法的问题是您需要更新对

的任何调用
$serviceManager->get('A') 

$serviceManager->get('FooPluginManager')->get('A')