2016-03-31 2 views
1

Предположат, что в моем приложении ZF2 У меня есть класс A, извлекаемые через сервис-менеджерПерекрытия реализации с менеджером ZF2 службы

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

Если, каждый раз я извлечение класса A, я хочу, вместо того, чтобы вернуть декоратор B из A, я мог бы использовать фабрику-делектор.

Что теперь, если я хотел бы украсить таким образом все классы, реализующие интерфейс I, всякий раз, когда я извлекаю их из диспетчера служб? Инициализаторы, похоже, не помогают здесь, так как они не могут заменить реализацию, полученную от диспетчера служб.

Есть ли способ сделать это? Любое предложение очень ценится

+0

Аннотация завод? Вы можете проверить, реализует ли служба 'I' функцию' canCreateServiceWithName'. – Ankh

+0

Я не могу изменить способ объявления A в объявлении менеджера сервисов. Мне нужно изменить только класс, возвращаемый диспетчером сервиса при получении класса 'A' ​​ – marcosh

ответ

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') 
+0

Спасибо, Алекс, но я думаю, что не могу этого сделать. Я работаю с внешней библиотекой, которая напрямую использует диспетчер сервисов, поэтому я не могу ввести менеджера плагина в игру. – marcosh

+0

@marcosh. Есть ли причина, по которой вы не можете просто зарегистрировать декоратор для каждой службы? – AlexP

+0

Потому что я работаю над модулем, который может быть использован кем-то другим, поэтому я не знаю, какой сервис мне нужно будет украсить. Я хотел бы разоблачить только интерфейс и использовать его для выполнения декорации – marcosh

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