2

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

//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()方法,并且它可以正确调用,但问题数据为空,并且数据数组包含设置了 inputfilter 的键,所有其他数据键都丢失了。

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

谢谢拉吉

4

2 回答 2

5

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

例如,如果您的实体和配置、、和方法具有各种属性(例如,bar和) ,则可以使用水合器:bazFoogetBar()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() {...}
}

然后你的控制器看起来像这样:

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”表单数据并过滤它们,这将起作用。

于 2012-12-22T16:35:57.037 回答
2

ClassMethodshydrator(在提取期间)将 getter 的结果(例如“getSomeProperty”)转换为键“some_property”的数组值

如果您的表单元素名称是“someProperty”,则不会发生提取和水合。

基本上:

"getProperty" getter <=> "property" 键(这里没问题)

“getSomeProperty” getter <=> “some_property” 键

为了提取和水合具有对应于驼峰式对象属性的驼峰式名称的表单元素,请执行以下操作:

$myform->setHydrator(new \Zend\Stdlib\Hydrator\ClassMethods(false));

“false”参数指示水合器不要将 camelCase 转换为 lowercase_underscore

您可以在表单构造函数中执行此操作。

于 2013-09-23T19:27:12.523 回答