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


Overriding implementation with ZF2 service manager

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

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

如果每次检索类A时,我都想返回A的decorator B,那么我可以使用delegator工厂。

现在,如果我想以这种方式装饰实现接口I的所有类,无论何时从服务管理器检索它们,该怎么办?初始化程序在这里似乎没有帮助,因为它们不能替代从服务管理器检索到的实现。

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

您可以创建一个自定义插件管理器,负责创建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')