首页 > 解决方案 > API 平台和 Symfony:为收集操作制作自定义控制器的正确方法是什么?

问题描述

据我了解,Api Platform 是对 Collection 的资源一一删除和更新。例如,我有一个 Activity 实体,它与 OpeningHours 具有多对一关系:如果我想通过 Admin Back Office 删除或添加多个 OpeningHours,我必须为每个 openingHour 调用一个“删除”操作,并具有其唯一性@ID。只要我的OpeningHours 很少,没关系:工作几秒钟就完成了。但是当我有成千上万个时我该怎么办?等一下?所以我创建了一个自定义控制器和一个自定义路由 - 到目前为止仅用于删除操作;更新操作将在之后进行。

第一个问题:这是正确的方法还是我错过了文档中的某些内容?

这是我的 Activity 实体的 API 配置:

/**
 * @ApiResource(
 *      collectionOperations={
 *         "get"={"normalization_context"={"groups"="activity:list"}},
 *         "post"={"denormalization_context"={"groups"="activity:post"}},
 *      },
 *      itemOperations={
 *          "get"={"normalization_context"={"groups"="activity:item"}},
 *          "put"={"denormalization_context"={"groups"="activity:item"}},
            "delete_opening_hours"={
 *             "method"="DELETE",
 *             "path"="/admin/activity/{id}/delete_opening_hours",
 *             "controller"=DeleteOpeningHoursAction::class,             
 *             "read"=false,
 *         },
*          "delete", "patch"
 *     },  
 *     attributes={"pagination_items_per_page"=10}
 * )

还有我的自定义控制器:

/**
 * Class DeleteOpeningHoursAction
 * @Security("is_granted('ROLE_ADMIN')")
 */
final class DeleteOpeningHoursAction extends AbstractController
{
    /**
     * @Route(
     *     name="delete_opening_hours",
     *     path="/admin/activity/{id}/delete_opening_hours",
     *     methods={"DELETE"},     
     * )
     */
    public function deleteHours(Activity $data):Activity
    {
        $em = $this->getDoctrine()->getManager(); 
        $activity = $em->getRepository('App\Entity\Activity')->find($data);
        $openingHours = $activity->getOpeningHours();

        foreach ($openingHours as $hour) {
            $em->remove($hour);
        }
   
        $em->flush();  
        $response = new Response();
        $response->setStatusCode(204);

        return $response;
    }
}

它完成了请求的工作:一次删除了所有 OpeningHours,但它返回 500 错误:

Return value of App\Controller\Action\DeleteOpeningHoursAction::deleteHours() must be an instance of App\Entity\Activity, instance of Symfony\Component\HttpFoundation\Response returned

如果我返回 $activity 而不是上面的响应,则错误消息变为:

Return value of App\Controller\Action\DeleteOpeningHoursAction::deleteHours() must be an instance of Symfony\Component\HttpFoundation\Response, instance of App\Entity\Activity returned

那么我做错了什么?自定义控制器的正确响应是什么?我很困惑。谢谢你的帮助。

标签: apisymfonyapi-platform.com

解决方案


推荐阅读