【问题标题】:Persisting several entities in 1 post (REST API) in Symfony 4 with FosrestBundle使用 FosrestBundle 在 Symfony 4 中的 1 个帖子(REST API)中保留多个实体
【发布时间】: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


    【解决方案1】:

    我不确定这样做是否正确,但这是一个可行的案例:

    我删除了 MyEntityCollection 实体及其表单类型。相反,我在控制器中执行此操作:

    /**
     * @Rest\View(statusCode=Response::HTTP_CREATED)
     * @Rest\Post("/myentity-collection")
     * @param Request $request
     * @return object
     */
    public function postMyEntityCollectionAction(Request $request)
    {
        $validation = array();
        foreach ($request->request->all() as $myEntityRequest) {
            $validation[] = $this->processForm(new MyEntity(), MyEntityType::class, $myEntityRequest);
        }
    
        return $validation;
    }
    

    我只是在 MyEntity 上发布一个数组作为我的路由参数。

    这样验证错误更容易理解,因为它们都在控制器返回的 $validation 数组中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 2018-06-03
      • 2011-05-25
      相关资源
      最近更新 更多