我正在尝试创建一个表单来创建新产品。
在我的控制器中,我有以下代码:
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);
但不确定如何以表格形式创建新产品。
有什么建议吗?
答案 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!