使用Doctrine ObjectSelect

时间:2015-06-30 22:19:52

标签: zend-framework doctrine-orm zend-framework2 doctrine

我尝试使用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)。

非常感谢提前。

1 个答案:

答案 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