Создание экземпляра поля является обязанностью FormElementManager. Когда вы пытаетесь получить доступ к форме, элементу формы или набору полей, FormElementManager
знает, где найти и как его создать. Такое поведение лечилось в разделе Default Services раздела рамки.
Поскольку надлежащий способ доступа к элементам формы извлекает их из FormElementManager, я бы написал BrandFieldsetFactory
, чтобы ввести этот адаптер БД или дополнительные зависимости к набору полей для построения для достижения этого.
ZF3 дружественный FIELDSET завод будет выглядеть так:
<?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
файле I 'd имеют конфигурацию, чтобы сообщить 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 после его строительства. В этот метод можно поместить любую логику после инициализации.
Может ли это использоваться в ZF2? У меня проблемы с работой. – Matt
Несомненно, после того, как завод ZF2 дружелюбен, он должен работать. Просто добавьте метод createService() на фабрику, как и другие фабрики zf2, и вызовите _invoke из этого метода. – edigu
Я не уверен, что вы имеете в виду. Если я var dump $ db в fieldset, я получаю имя класса («brandfieldset»). Это не похоже на то, что фабрика когда-либо называется (если я выхожу или var dump на фабрике ничего не происходит) – Matt