У меня есть некоторые базовые знания 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'
);
Если вы не хотите, чтобы создатели плагинов изменяли service_manager в файле module.config.php, тогда у вас есть два варианта:
Один из вариантов — создание Factory for MyService, который будет искать зависимости в этих папках плагинов.
Другой вариант — создать метод вызова для MyService, передавая плагин в качестве аргумента, а затем вы создаете экземпляр плагина.
Но способ работы zf2 заключается в использовании module.config.php для регистрации экземпляров в service_manager. Так что если создатели плагинов смогут использовать service_manager, будет лучше.
[ОБНОВИТЬ]Zend FactoryInterface используется для создания экземпляров, которые имеют зависимости, поэтому эти зависимости создаются или извлекаются из ServiceManager, а затем вводятся через конструктор в экземпляр, для которого была создана фабрика.
В вашем случае разработчики ваших плагинов должны будут создать фабрики для своих плагинов и зарегистрировать эти фабрики в service_manager. Если этого не произошло, вам нужен способ узнать, есть ли у плагина зависимости.
Надеюсь это поможет
Исмаэль Траскастро
Других решений пока нет …