使用doctrine 2在zend框架中保存复杂的表单数据

时间:2011-08-17 20:34:56

标签: zend-framework symfony1 doctrine doctrine-orm

Doctrine 2与ZF的整合似乎使得简单的事情变得非常困难和耗时(至少对我而言)。

我不能只提交一个提交的表单数组到doctrine来自动将键/值对映射到doctrine实体,如果我有一个多对多实体并且提交的表单有嵌套数组,它会变得非常复杂。

在symfony中,提交的表单键/值很容易并自动映射并保存到doctrine表中。我不知道如何在ZF中这样做,特别是如果我有“多对多”和/或“多对一”的学说实体,并且我有**嵌套的表单元素需要多级迭代。

我不想明确地设置每个实体并手动创建每个实体对象** 如果我使用ZF的原生数据库架构,疼痛会少很多。

我已经做了一些编码,现在它已经半自动完成,但不是很有用。

2 个答案:

答案 0 :(得分:0)

您应该将这种逻辑编程到模型中。

我通常会将这种逻辑添加到我的表单中,例如

class Application_Form_SomeModel extends Zend_Form
{
    // the usual stuff

    public function populateModel(\Entity\Model $model)
    {
        $model->setSomething($this->getValue('something'));

        $subForm = $this->getSubForm('name');

        $relatedModel = new \Entity\RelatedModel;
        $relatedModel->setSomething($subForm->getValue('something'));

        $model->getRelatedModels()->add($relatedModel);

        // assuming the related model collection has cascade persist
        // otherwise you'll need to pass in the entity manager to persist
        // the new model
    }
}

我是这样做的,因为表单的元素实际上只为表单所知。这允许您封装表单中的表单及其元素名称的所有内容,而不必假设任何其他人知道此信息。

答案 1 :(得分:0)

我认为最好的解决方案是使用PHP的Reflection API来注入/检索实体中的值(使用智能get / set检测)。我启动了一个名为ObjectSerializer的小库来帮助完成该过程,但从未完成。也就是说,如果你看一下these two classes中包含的逻辑,你可能会知道从哪里开始。