我有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设置的键,所有其他数据键都缺失。
如果需要,我可以添加更多代码段。
由于 拉吉
答案 0 :(得分:5)
将实体绑定到表单通常使用水合器完成。水化器将数据数组转换为值对象,反之亦然。因此,您需要配置表单以获得适合您实体的正确保湿剂。
例如,如果您有实体bar
的各种属性(例如baz
和Foo
)并配置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
您可以在表单构造函数中执行此操作。