За создание экземпляра набора полей отвечает FormElementManager. . Когда вы пытаетесь получить доступ к форме, элементу формы или набору полей, FormElementManager
знает, где их найти и как их создать. Это поведение описано в разделе службы по умолчанию в структуре. .
Поскольку правильный способ доступа к элементам формы — это извлечение их из FormElementManager, я бы написал BrandFieldsetFactory
для внедрения этого адаптера БД или дополнительных зависимостей в набор полей при построении для достижения этой цели.
Фабрика, дружественная к ZF3, будет выглядеть так:
<?php
namespace Application\Form\Factory;
use Application\Form\BrandFieldset;
use Interop\Container\ContainerInterface;
class BrandFieldsetFactory
{
/**
* @return BrandFieldset
*/
public function __invoke(ContainerInterface $fem, $name, array $options = null)
{
// FormElementManager is child of AbstractPluginManager
// which makes it a ContainerInterface instance
$adapter = $fem->getServiceLocator()->get('Your\Db\Adapter');
return new BrandFieldset($adapter);
}
}
На этом этапе BrandFieldset
должен расширять Zend\Form\Fieldset\Fieldset
, и его конструктор может выглядеть следующим образом:
private $dbAdapter;
/**
* {@inheritdoc}
*/
public function __construct(My/Db/Adapter $db, $options = [])
{
$this->dbAdapter = $db;
return parent::__construct('brand-fieldset', $options);
}
Наконец, в файле module.config.php
у меня будет конфигурация, чтобы сообщить FormElementManager
об этой фабрике:
<?php
use Application\Form\BrandFieldset;
use Application\Form\Factory\BrandFieldsetFactory;
return [
// other config
// Configuration for form element manager
'form_elements' => [
'factories' => [
BrandFieldset::class => BrandFieldsetFactory::class
],
],
];
СОВЕТ. Метод BrandFieldset::init()
будет автоматически вызываться FormElementManager после построения. В этот метод можно поместить любую логику пост-инициализации.
04.02.2017