2015-04-02 3 views
4

Я думаю, что это простой вопрос.Инициализаторы ZF2 и TranslatorAwareInterface

ZF2's ServiceManager может автоматически вводить зависимости, если определенные интерфейсы реализованы в классе, т.е. ServiceLocatorAwareInterface или EventManagerAwareInterface.

Мой вопрос: почему он не вводит переводчика, когда я реализую TranslatorAwareInterface?

+0

Как вы создаете экземпляр класса? –

+0

Вызов $ serviceman-> get ('Class'), который вызовет фабрику для этого класса. – user2148043

ответ

4

Это происходит потому, что конфигурация ZF2 ServiceManager имеет значение по умолчанию initializers для услуг, реализующих ServiceManagerAwareInterface или ServiceLocatorAwareInterface.

Вы можете найти ServiceManagerAwareInitializer и ServiceLocatorAwareInitializer в __construct method of the ServiceManagerConfig.

Чтобы достичь этого для своих собственных интерфейсов, вам необходимо зарегистрировать свой собственный 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.

Подробнее о initializers в ZF2 documentation for the ServiceManager.

Помните, что для каждой создаваемой вами службы initializer будет проверять, нужно ли ей вводить вашу зависимость.

+0

Очень хорошее объяснение! Спасибо – user2148043

+0

Я думаю, что zf2 имел этот инициализатор по умолчанию, и по какой-то причине они удалили его: http://zend-framework-community.634137.n4.nabble.com/TranslatorAwareTreeRouteStack-td4661094.html –

Смежные вопросы