api - 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
那么我做错了什么?自定义控制器的正确响应是什么?我很困惑。谢谢你的帮助。
解决方案
推荐阅读
- java - JFrame 突然吓坏了
- spring-boot - 使用索引查询时使用 Spring Boot 的 Elasticsearch 返回 nullPointerExciption
- r - 创建一个函数,将变量转换为 R 中的因子
- multithreading - 主线程退出如何与循环子线程一起工作?
- excel - 需要减少运行时间来删除删除线字符
- sql-server - org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback;未分类 SQLException; '@P0DIAGNOSIS_DATA' 附近的语法不正确
- python - 基于列条件python pandas的填充和替换
- arrays - 只有 size-1 的数组可以转换为 Python 标量 / Rasterio
- javascript - 如何禁用标签中的闪烁光标
- sql - 有没有办法在 BigQuery 中添加“虚拟”行?