我们使用ZF2工作,但对于我们的最后一个项目,我们决定开始与ZF3。
现在我面临的创作形式的问题。Zend框架3自定义元素
我想要做的是创建一个自定义选择从数据库检索值填充。
我在ZF2所做的是创建延伸的选择一类,与ServiceLocatorAwareInterface
,如:
class ManufacturerSelect extends Select implements ServiceLocatorAwareInterface {
public function init() {
$manufacturerTable = $this->getServiceLocator()->get('Car\Model\ManufacturerTable');
$valueOptions = [];
foreach ($manufacturerTable->fetchAll() as $manufacturer) {
$valueOptions[$manufacturer->getManufacturerId()] = $manufacturer->getName();
}
$this->setValueOptions($valueOptions);
}
public function getServiceLocator() {
return $this->serviceLocator;
}
public function setServiceLocator(ServiceLocatorInterface $serviceLocator) {
$this->serviceLocator = $serviceLocator;
}
}
然后,在表格中使用它,它足以让全名
$this->add(
array(
'name' => 'manufacturer_id',
'type' => 'Car\Form\Element\ManufacturerSelect'
)
);
现在这是不可能了,因为服务定位器被删除,工厂的使用是必要的,但我正在努力寻找如何做同样的事情。
牢记使用的工厂,我想这个配置module.config.php
:
'form_elements' => [
'factories' => [
'Car\Form\Element\ManufacturerSelect' => function ($services) {
$manufacturerTable = $services->get('Car\Model\ManufacturerTable');
return new ManufacturerSelect($manufacturerTable);
},
'Car\Form\CarForm' => function ($services) {
$manufacturerTable = $services->get('Car\Model\ManufacturerTable');
return new CarForm($manufacturerTable, 'car-form');
}
]
]
结果:CarForm的工厂总是被调用,但ManufacturerSelect的工厂不是。
一个简单的解决方案是直接在窗体类填充的选择,但我更愿意用工厂的元素到处重用我想,我是在做ZF2。
有谁已经遇到了这个问题,并找到了解决办法?
你得到什么错误?请不要使用闭包作为工厂使用http://zendframework.github.io/zend-servicemanager/migration/#factoryinterface - >闭包不可缓存,并且不像工厂类可重用 – Dymen1
其实,我不是得到一个错误,工厂根本就没有被调用。我100%肯定它,因为我甚至在里面放了一个模子,没有成功的结果。 关闭关闭,我用它们只是为了在这里表示,通常我使用类。 – Matteo
如何将'Car \ Form \ Element \ ManufacturerSelect'添加到您的表单中?仍然使用'$ this-> add(['type'=> class])'? – Dymen1