Zf2和Doctrine Annotations制造一个新的'形成

时间:2013-06-14 07:17:38

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

我正在尝试创建一个表单来创建新产品。

在我的控制器中,我有以下代码:

public function newAction() {

    $repo = $this->getEntityManager()->getRepository('Swap\Entity\Product');

    $builder = new AnnotationBuilder($this->getEntityManager());
    $form = $builder->createForm($repo);
    $config = $this->getModuleConfig();
    if (isset($config['swap_form_extra'])) {
        foreach ($config['swap_form_extra'] as $field) {
            $form->add($field);
        }
    }

    $form->setHydrator(new DoctrineHydrator($this->getEntityManager(), 'Swap\Entity\Product'));
    $form->bind($repo);
    return new ViewModel(array('form' => $form));
}

现在这给了我以下错误:

Class "Swap\EntityRepository\Product" sub class of "Doctrine\ORM\EntityRepository" is not a valid entity or mapped super class.

我不确定这是否与它有关:但是当您想要编辑表单中的对象时,您可以这样做:

    $repo = $this->getEntityManager()->getRepository('Swap\Entity\Product');
    $id = (int) $this->getEvent()->getRouteMatch()->getParam('id', '0');
    $product = $repo->find(1);
    $productNames = $this->getEntityManager()->getRepository('Swap\Entity\ProductGroup')->findAll();
    $product->SetProductGroup($productNames);
    $builder = new AnnotationBuilder($this->getEntityManager());
    $form = $builder->createForm($product);

但不确定如何以表格形式创建新产品。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

表单围绕实体构建,而不是存储库。在Doctrine中它们之间有明显的区别:实体是持有状态的对象,与数据库表相关,您可以在其中创建新的,更新现有的和删除的对象。存储库是帮助程序类。它们可以帮助您查找实体。通常您可以通过id找到一个或者找到所有,但是存储库也可以帮助您通过特定属性找到一个或多个实体。

也就是说,表单构建器需要实体。在编辑为新操作时,您希望基于实体进行构建。在editAction中,你这样做(伪):

$product = findMyProductEntity();
$form    = $builder->createForm($product);

在newAction中,你这样做(伪):

$repository = findMyProductRepository();
$form       = $builder->buildForm($repository);

在这种情况下,您还需要注入实体而不是存储库。怎么样?只需使用new

即可
public function newAction()
{    
    $product = new Swap\Entity\Product;
    $builder = new AnnotationBuilder($this->getEntityManager());
    $form = $builder->createForm($product);

    // Rest of your code
}

答案 1 :(得分:-2)

您告诉它从实体存储库实例构建表单,而不是实体本身。

 $form = $builder->createForm($repo);  // $repo is not an entity!