8

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

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

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

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

总结: - 从实体创建表单的最佳方式。- @Form 和 @Annotation 之间的区别 - Doctrine 的实体有 Hydrator 吗?

4

1 回答 1

12

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

第二:水合器。当结合 Doctrine 2 使用 ZF2 Forms 时,您很可能希望使用位于内部的 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() 是一个实体对象

当不使用注释并且您引用另一个实体时,请确保您使用适当的表单元素(在大多数情况下,这将是一个选择元素(例如为 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。这就是为什么理想情况下您希望使用另一个设置器扩展第一个代码示例以将 entityManager 注入您的表单对象。

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

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

希望这可以帮助你一点,我没有写太多脱离上下文:P

于 2012-11-20T21:55:33.647 回答