我尝试使用ZF2.5和Doctrine2从表单中水合对象时遇到问题。
我有一个创建表单,其基本字段集配置为对象类型A.它配置了一个ClassMethods水合器,并使用" new A()"进行初始化。宾语。本身,这个表单按预期工作 - 从控制器,在验证时,我可以调用$ form-> getData()来接收类型A的对象,然后我将其保存到数据库。
A类与B类有很多关系。我试图将这种关系添加到上面提到的字段集中,如下所示:
$this->add([
'name' => 'class_A_field_name_for_class_B',
'type' => 'DoctrineModule\Form\Element\ObjectSelect',
'options' => array(
'object_manager' => $this->entity_manager,
'target_class' => '\my\ClassB',
'property' => 'name',
'is_method' => true,
'label' => 'Class B Selection'
),
'attributes' => [
'class' => 'form-control',
'required' => true
]
]);
不幸的是,我得到的错误类似于:
参数1传递给我的\ ClassA :: setClassB() 必须是我的\ ClassB的一个实例, 给出的字符串,调用 /vagrant/vendor/zendframework/zend-stdlib/src/Hydrator/ClassMethods.php 在第220行并定义
我无法弄清楚我做错了什么。任何接受者?我试过更改'属性'字段到' id'但所有这一切都是尝试并调用setClassB(3)(而不是保护id 3的ClassB实例并将其传递给setClassB)。
非常感谢提前。
答案 0 :(得分:2)
发布时选择框的值为字符串,ClassMethods
水分符在调用setClassB($string)
时使用此值;随后失败,因为该方法需要类型为ClassB
的对象。
为了使这种关系保持水合,您需要使用Doctrine object hydrator, DoctrineModule\Stdlib\Hydrator\DoctrineObject
。此水合器将相关的ID转换为新的(或现有的)ClassB
实例。
use DoctrineModule\Stdlib\Hydrator\DoctrineObject;
$hydrator = new DoctrineObject($entityManager);
$objectA = new ClassA();
$data = [
'name' => 'New class A',
'classB' => 4
);
$objectA = $hydrator->hydrate($data, $objectA);
echo $objectA->getName(); // 'new class A'
echo gettype($objectA->getClassB()); // object of type ClassB