我认为这是一个简单的问题。
如果在类中实现某些接口,ZF2的ServiceManager
可以自动注入依赖关系,即。 ServiceLocatorAwareInterface
或EventManagerAwareInterface
。
我的问题是:为什么我在实施TranslatorAwareInterface
时没有注入翻译?
答案 0 :(得分:4)
这是因为ZF2 ServiceManager
配置对于实现initializers
或ServiceManagerAwareInterface
的服务具有默认ServiceLocatorAwareInterface
。
您可以在__construct
method of the ServiceManagerConfig
中找到ServiceManagerAwareInitializer
和ServiceLocatorAwareInitializer
。
要为您自己的界面实现此目的,您必须注册自己的initializer
。这里有一个关于如何为翻译者执行此操作的示例:
'service_manager' => array(
'invokables' => array(
//...
),
'factories' => array(
//...
'translator' => 'My\Factory\TranslatorFactory'
),
'initializers' => array(
// Inject translator into TranslatorAwareInterface
'translator' => function($service, ServiceLocatorInterface $serviceLocator) {
if ($service instanceof TranslatorAwareInterface) {
$translator = $serviceLocator->get('translator');
$service->setTranslator($translator);
}
}
)
)
您必须确保在translator
中将翻译人员注册为serviceManager
才能使其发挥作用。我用My\Factory\TranslatorFactory
创建了它。
详细了解ZF2 documentation for the ServiceManager
中的initializers
。
请注意,对于您创建的每项服务,initializer
都会检查是否需要注入您的依赖项。