gpt4 book ai didi

forms - zf2 表单绑定(bind)对象问题

转载 作者:行者123 更新时间:2023-12-05 01:24:49 26 4
gpt4 key购买 nike

我有一个 zf2 问题,表单绑定(bind)对象程序,简而言之,我试图在表单验证通过后自动从表单对象到我的实体的数据交换,为此我实现了两个接口(interface) InputFilterAwareInterfaceArraySerializableInterface,前面的接口(interface)用于表单对象获取输入过滤器,后面的接口(interface)用于表单和我的实体之间的数据交换。下面是放在我的 Controller 中的一小段代码。

//Controller code
$companyForm = new \Manage\Forms\CompanyForm();
$companyEntity = $this->getServiceLocator()->get('Manage/CompanyEntity');
$postData = $this->getRequest()->getPost()->toArray();
$companyEntity->exchangeArray($postData);
$companyForm->bind($companyEntity);
if($companyForm->isValid(){
....
}

这应该在我的实体对象中自动调用 exchangeArray() 方法并且它正确执行问题数据是空的,并且数据数组还包含具有输入过滤器设置的键,所有其他数据键都丢失了。

如果需要,我可以添加更多代码片段。

谢谢拉吉

最佳答案

将实体绑定(bind)到表单通常使用水合器完成。 hydrator 将数据数组转换为值对象,反之亦然。因此,您需要配置您的表单以拥有适合您的实体的正确水化器。

例如,如果您的实体 Foo 具有各种属性(例如,barbaz)并配置 getBar ()setBar()getBaz()setBaz()方法,可以使用ClassMethods 水化器:

use Zend\Form\Form;
use Zend\StdLib\Hydrator\ClassMethods;

class Foo extends Form
{
public function __construct()
{
parent::__construct();

$this->setHydrator(new ClassMethods);

// More here for the elements now
}
}

以及您的实体:

class Foo
{
public function getBar() {...}
public function setBar() {...}

public function getBaz() {...}
public function setBaz() {...}
}

然后你的 Controller 看起来像这样:

public function createAction()
{
$entity = new My\Entity\Foo;
$form = new My\Form\Foo;
$form->bind($entity);

if ($this->getRequest()->isPost()) {
$data = $this->getRequiest()->getPost();
$form->setData($data);

if ($form->isValid()) {
// $entity is now populated with data
// persist $entity here
}
}

// create view model here
}

如果您的表单中有元素“bar”和“baz”并提供了正确的输入过滤器来获取“bar”和“baz”表单数据并过滤它们,这将起作用。

关于forms - zf2 表单绑定(bind)对象问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14003506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com