从Doctrine Entities创建ZF 2表单

时间:2012-11-20 14:43:09

标签: doctrine-orm zend-framework2

我想知道的是创建与实体匹配的表单的最佳方式。

  • 手动在代码中或使用表单注释创建表单?
  • 使用实体的注释?

我看到了一些不同的例子,一些使用@Annotation,另一些使用@Form?有人可以解释一下这个区别吗?

如果实体具有相关/嵌套实体,我是否需要为每个实体提供自定义水合器?我假设Doctrine可能已经有一个实现水合器接口的工作?

总结:    - 从实体创建表单的最佳方式。    - @Form和@Annotation之间的区别    - Doctrine是否为其实体提供了Hydrator?

1 个答案:

答案 0 :(得分:11)

首先:注释是速度杀手。如果要使用注释构建器,请始终缓存创建的对象。但注释也是使表单运行的最简单方法;)

第二:保湿器。将ZF2 Forms与Doctrine 2结合使用时,您很可能希望使用位于其中的DoctrineEntity Hydrator。请考虑以下代码:

$form = new ReferenzwertForm();
$form->setHydrator(new DoctrineEntity($serviceLocator->get('Doctrine\ORM\EntityManager')))
     ->setObject(new Referenzwert())
     ->setInputFilter(new ReferenzwertFilter())
     ->setAttribute('method', 'post');
return $form;
  • ReferenzwertForm()的类型为Zend\Form\Form Object
  • DoctrineEntity()的类型为DoctrineORMModule\Stdlib\Hydrator\DoctrineEntity
    • DoctrineEntity需要提供的EntityManager。在ZF2中使用Doctrine 2时,您应该熟悉这一点
  • Referenzwert()是一个实体对象

当不使用注释并且您正在引用另一个实体时,请确保使用适当的表单元素(在大多数情况下,这将是一个select元素(比如为BlogEntity选择CategoryEntity等)

$this->add(array(
    'name' => 'type',
    'type' => 'DoctrineORMModule\Form\Element\DoctrineEntity',
    'options' => array(
          'label' => 'Choose a MyEntity',
          'object_manager' => $this->getEntityManager(),
          'target_class' => 'Namespace\Entity\MyEntity',
          'property' => 'name'
    ),
    'attributes' => array(
        'required' => true
    )
));

如您所见,Form元素也需要了解entityManager。这就是为什么理想情况下你想用另一个setter来扩展第一个Code-Example,将entityManager注入到表单对象中。

$form->setEntityManager($serviceLocator->get('Doctrine\ORM\EntityManager'))
     ->set()//all the other stuff

一般来说最好的方法是什么?我会说没有。出于速度目的,注释仅仅是杀手。使用缓存版本应该有所帮助,尽管我还没有在ZF2中进行缓存的个人经验。我喜欢在注释之外手工创建表单,因为我的IDE支持很多东西,但肯定不会形成注释:D

希望这对你有所帮助,而且我没有写出过多的背景:P