ZF2初始化器和TranslatorAwareInterface

时间:2015-04-02 09:58:56

标签: php zend-framework zend-framework2

我认为这是一个简单的问题。

如果在类中实现某些接口,ZF2的ServiceManager可以自动注入依赖关系,即。 ServiceLocatorAwareInterfaceEventManagerAwareInterface

我的问题是:为什么我在实施TranslatorAwareInterface时没有注入翻译?

1 个答案:

答案 0 :(得分:4)

这是因为ZF2 ServiceManager配置对于实现initializersServiceManagerAwareInterface的服务具有默认ServiceLocatorAwareInterface

您可以在__construct method of the ServiceManagerConfig中找到ServiceManagerAwareInitializerServiceLocatorAwareInitializer

要为您自己的界面实现此目的,您必须注册自己的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都会检查是否需要注入您的依赖项。