【发布时间】:2018-10-03 17:33:25
【问题描述】:
我想使用 fosrestbundle 在 1 个帖子中发布多个实体。目前持久化 1 个实体效果很好,但我不确定如何处理多个实体。
我现在尝试的是创建一个 MyEntityCollection 类,其中仅包含 1 个属性,它是 MyEntity 的集合:
class MyEntityCollection
{
/*
* @var Collection
*/
protected $myEntities;
/**
* @return mixed
*/
public function getMyEntities()
{
return $this->myEntities;
}
/**
* @param mixed $myEntities
*/
public function setMyEntities($myEntities): void
{
$this->myEntities= $myEntities;
}
/**
* @param MyEntity $myEntity
* @return MyEntityCollection
*/
public function addMyEntity(MyEntity $myEntity): MyEntityCollection
{
$this->myEntities->add($myEntity);
return $this;
}
}
我还创建了一个MyEntityCollectionType formType:
class MyEntityCollectionType extends AbstractType
{
/**
* This function sets the fields of the form
* @param FormEvent $event the PRE_SET_DATA event
*/
public function setFields(FormEvent $event): void
{
$form = $event->getForm();
$form
->add('myEntities', EntityType::class, array(
'required' => true,
'multiple' => true,
'class' => MyEntity::class
));
//->add('myEntities', CollectionType::class, array(
// 'required' => true,
// 'data_class' => MyEntity::class
//));
}
而我的控制器操作如下所示:
protected function processForm($entity, String $entityTypeClass, $request)
{
if (empty($entity)) {
throw new NotFoundHttpException('Entity not found');
}
$form = $this->createForm(
$entityTypeClass,
$entity
);
$form->submit($request->request->all(), false);
if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();
return $entity;
}
return $form;
}
/**
* @Rest\View(statusCode=Response::HTTP_CREATED)
* @Rest\Post("/myEntity-collection")
* @param Request $request
* @return object
*/
public function postMyEntityCollectionAction(Request $request): object
{
$myEntityCollection = new MyEntityCollection();
return $this->processForm($myEntityCollection, MyEntityCollectionType::class, $request);
}
当我尝试将数据发布到路由时,我收到此错误: 类“App\Enablon\Checklist\Desktop\Domain\MyEntityCollection”不是有效的实体或映射的超类。
为了清楚起见,我不想持久化 MyEntityCollection 实体,只保留几个 MyEntity,但在我看来,如果需要将实体类暴露给 post 路由,这似乎是一种创建实体类的干净方法。
也许我只是没有采取正确的方法,所以我对任何建议都持开放态度,但在我看来,这似乎是实现我想要做的事情的一种干净的方式。
【问题讨论】:
标签: rest api symfony fosrestbundle