zf2表单绑定对象问题

时间:2012-12-22 14:06:30

标签: forms binding zend-framework2

我有zf2的问题,表单绑定对象程序,简而言之我试图通过表单验证来自表单对象的数据交换自动化,为此我实现了两个接口 InputFilterAwareInterface < / strong>和 ArraySerializableInterface ,早期的接口是表单对象获取输入过滤器,后面的接口是表单和我的实体进行数据交换。下面是我控制器中放置的代码的简短片段。

//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设置的键,所有其他数据键都缺失。

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

由于 拉吉

2 个答案:

答案 0 :(得分:5)

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

例如,如果您有实体bar的各种属性(例如bazFoo)并配置getBar()setBar(),{ {1}}和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() {...}
}

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

答案 1 :(得分:2)

ClassMethods水分器(在提取过程中)将来自“getSomeProperty”等getter的结果转换为键“some_property”的数组值

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

基本上:

“getProperty”getter&lt; =&gt; “财产”键(这里没问题)

“getSomeProperty”getter&lt; =&gt; “some_property”键

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

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

“false”参数指示保护器不将camelCase转换为lowercase_underscore

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