这很棘手,但如果您想使用 Zend Framework 1.X 构建类似的东西,您可能必须扩展Zend_Form
.
您可以通过这种方式构建一个接受EntityManager
(或泛型Doctrine\Common\Persistence\ObjectManager
作为依赖项以及实体的类)。
然后,您可以分析与您的实体关联的元数据,或者定义一组必须针对该实体进行检查的字段。通常,您所做的是与Doctrine\Common\Persistence\Mapping\ClassMetadata
构造函数中的以下实例进行交互:
// in class Your\Form\EntityDriven
// $this->em is the EntityManager passed in
// $this->entity is the Entity object passed to the constructor
$class = $this->em->getClassMetadata(get_class($this->entity));
foreach ($class->getFieldNames() as $fieldName) {
// Add fieldst to the form based by their eventual @Column(type="...")
// Eventually, you could use your own AnnotationDriver to get more
// constraints as Symfony 2 does
}
那应该确实有效。验证器将附加到表单实例。要保留表单,您可以覆盖persistData
公共方法,如下所示:
public function persistData()
{
$this->em->persist($this->entity);
$this->em->flush($this->entity);
}
我不会在@postPersist
or之类的生命周期事件中进行验证@preUpdate
,因为在这些情况下防止持久性的唯一方法是抛出异常(除非您使用外部侦听器,但这更加复杂)。你最终会得到一个封闭的EntityManager
.
如果您对 Zend Framework 2 中应用的概念感兴趣,新Zend\Form
的(参见 diff)组件使用hydrator将值分配给模型,因此它不会直接与它们交互,而是可以使用逻辑来发现 setter/getter 或公共属性(仅作为示例)。输入过滤已Zend\InputFilter
作为一个新组件移至,因为它也应该在没有表单的情况下使用(您想要做什么)。验证已经解耦,但一般来说,当数据无效时不应执行 hydrator。所以现在你应该可以写一个EntityHydrator
and了EntityValidator
。如果你愿意贡献,请在DoctrineModule上做一个 Pull Request :)