【发布时间】:2017-11-03 15:20:18
【问题描述】:
我们习惯于使用 ZF2,但对于我们的上一个项目,我们决定从 ZF3 开始。
现在我在创建表单时遇到了问题。
我想做的是创建一个自定义选择,其中填充了从数据库中检索到的值。
我在 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 中所做的那样。
是否有人已经遇到过这个问题并找到了解决方案?
【问题讨论】:
-
您遇到什么错误?请不要使用闭包,因为工厂使用 zendframework.github.io/zend-servicemanager/migration/… -> 闭包不可缓存,也不像工厂类那样可重用
-
实际上,我没有收到错误,工厂根本没有被调用。我 100% 确定这一点,因为我什至在里面放了一个骰子,但没有成功。关于闭包,我在这里只使用它们来表示,通常我使用类。
-
如何将
Car\Form\Element\ManufacturerSelect添加到表单中?还在使用$this->add(['type' => class])? -
是的,完全一样
-
你能确认
$this->add被调用了吗
标签: php zend-framework3