0

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

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

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);

但不确定如何以一种形式获取产品以创建新实体。

有什么建议么?

4

2 回答 2

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
}
于 2013-06-14T09:14:23.750 回答
-2

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

 $form = $builder->createForm($repo);  // $repo is not an entity!
于 2013-06-14T09:13:35.980 回答