zf2: модуль с подключаемыми плагинами

У меня есть некоторые базовые знания ZF2 для создания обычных проектов. Теперь я хочу создать модуль, который будет расширяться сообществом пользователей путем создания плагинов для его функций.

Я создал базовую архитектуру, как

ModuleName
src
Service
MyService.php
Factory
Fun1Factory.php
Fun2Factory.php
Plugins
Fun1Plugins
PluginA.php
PluginB.php
Fun2Plugins
PluginC.php
PluginD.php

Я создал два фабричных класса (не из zf2 factoryinterface) для обработки каждого типа функциональности, такой как Fun1Factory.php & Fun2Factory.php. Они оба зарегистрированы в module.config.php через invokables.

'invokables' => array (
'Fun1Factory' => 'ModuleName\Factory\Fun1Factory',
'Fun2Factory' => 'ModuleName\Factory\Fun2Factory',
)

Теперь MyService фактически вызывает их с аргументами для конкретных плагинов. Как ниже.

$fun1Factory = $this->getServiceLocator()->get('Fun1Factory');
$fun1Factory->setSettings($settings['fun1']);
$this->fun1Plugin = $fun1Factory->getPlugin();
$this->fun1Plugin->init();

$fun2Factory = $this->getServiceLocator()->get('Fun2Factory');
$fun2Factory->setSettings($settings['fun2']);
$this->fun2Plugin = $fun2Factory->getPlugin();
$this->fun2Plugin->init();

Так что код можно назвать так

$service = $this->getServiceLocator()->get('ModuleName\Service\MyService');
$service->init(array('fun1' => 'pluginA', 'fun2' => 'pluginD'));

Ранее я создавал подобное, используя базовый шаблон MVC + Factory. Но я не знаю, как это должно быть встроено в ZF2. ZF2 предоставляет заводской интерфейс, но это похоже на автоматическую загрузку некоторых сервисов / контроллеров. Если есть какие-либо руководства, как создать такой модуль?

ОБНОВЛЕНИЕ: я могу сделать заводской код также в классе MyService. Но я думаю о «ZF2 WAY» для этого.

БОЛЬШЕ ДЕТАЛЕЙ: У меня вопрос об обновлении с более подробной информацией. Ближайший я нашел в https://samsonasik.wordpress.com/2014/01/29/zend-framework-2-getting-closer-with-pluginmanager/ . Но мне все еще нужно динамически регистрировать плагин на заводе, а не статически, как показано ниже.

protected $invokableClasses = array(
//represent invokables key
'xls' => 'Tutorial\Plugin\Xls',
'pdf' => 'Tutorial\Plugin\Pdf'
);

0

Решение

Если вы не хотите, чтобы создатели плагинов изменяли service_manager в файле module.config.php, тогда у вас есть два варианта:

Один из вариантов — создание Factory for MyService, который будет искать зависимости в этих папках плагинов.

Другой вариант — создать метод вызова для MyService, передавая плагин в качестве аргумента, а затем вы создаете экземпляр плагина.

Но способ работы zf2 заключается в использовании module.config.php для регистрации экземпляров в service_manager. Так что если создатели плагинов смогут использовать service_manager, будет лучше.

[ОБНОВИТЬ]

Zend FactoryInterface используется для создания экземпляров, которые имеют зависимости, поэтому эти зависимости создаются или извлекаются из ServiceManager, а затем вводятся через конструктор в экземпляр, для которого была создана фабрика.

В вашем случае разработчики ваших плагинов должны будут создать фабрики для своих плагинов и зарегистрировать эти фабрики в service_manager. Если этого не произошло, вам нужен способ узнать, есть ли у плагина зависимости.

Надеюсь это поможет

Исмаэль Траскастро

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector