【问题标题】:Hydration of form object that uses Doctrine ObjectSelect使用 Doctrine ObjectSelect 的表单对象的水合
【发布时间】:2015-06-30 22:19:52
【问题描述】:

我在尝试使用 ZF2.5 和 Doctrine2 对表单中的对象进行水合时遇到问题。

我有一个创建表单,其中包含为对象类型 A 配置的基本字段集。它配置了 ClassMethods 水合器,并使用“new A()”对象进行了初始化。就其本身而言,此表单按预期工作 - 从控制器,在验证后,我可以调用 $form->getData() 来接收 A 类型的对象,然后我将其保存到数据库中。

A 类与 B 类有 manyToOne 关系。我尝试将这种关系添加到上面提到的字段集中,如下所示:

$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 传递给 my\ClassA::setClassB() 必须是 my\ClassB 的一个实例, 给定的字符串,调用 /vagrant/vendor/zendframework/zend-stdlib/src/Hydrator/ClassMethods.php 在第 220 行并定义

我无法弄清楚我做错了什么。有接盘侠吗?我尝试将“属性”字段更改为“id”,但所做的只是尝试调用 setClassB(3)(而不是水合 id 3 的 ClassB 实例并将其传递给 setClassB)。

非常感谢。

【问题讨论】:

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


    【解决方案1】:

    发布时选择框的值将是一个字符串,ClassMethods hydrator 在调用setClassB($string) 时使用此值;随后失败,因为该方法需要 ClassB 类型的 object

    为了巩固这种关系,您需要使用Doctrine object hydrator, DoctrineModule\Stdlib\Hydrator\DoctrineObject。此 hydrator 会将相关 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多