因此,由于api-platform.com Unable to generate an IRI for the item of type,我尝试了一种不同的方法,并在我的用户实体上声明了用于登录、注册和重置的自定义操作(因为我仍然需要它们的自定义业务逻辑)。因此,在api-platform中的初始设置相当简单。我将以下代码添加到我的用户实体中
* collectionOperations={
* "register"={"route_name"="user_register","normalization_context"={"groups"={"registerRead"}},"denormalization_context"={"groups"={"registerWrite"}}},
* "reset"={"route_name"="user_reset","normalization_context"={"groups"={"resetRead"}},"denormalization_context"={"groups"={"resetWrite"}}},
* "login"={"route_name"="user_login","normalization_context"={"groups"={"loginRead"}},"denormalization_context"={"groups"={"loginWrite"}}},
* "token"={"route_name"="user_token","normalization_context"={"groups"={"tokenRead"}},"denormalization_context"={"groups"={"token"}}}
* },然后将适当的操作添加到用户控制器。
/**
* @Route(
* name="user_login",
* path="api/user/login",
* methods={"POST"},
* defaults={
* "_api_resource_class"=User::class,
* "_api_collection_operation_name"="login",
* "_api_receive"=false
* }
* )
*/
public function loginAction(User $data): User {
///$this->userService->login($data);
return $data;
}
/**
* @Route(
* name="user_register",
* path="api/user/register",
* methods={"POST"},
* defaults={
* "_api_resource_class"=User::class,
* "_api_collection_operation_name"="register",
* "_api_receive"=false
* }
* )
*/
public function registerAction(User $data): User {
///$this->userService->register($data);
return $data;
}
/**
* @Route(
* name="user_reset",
* path="api/user/reset",
* methods={"POST"},
* defaults={
* "_api_resource_class"=User::class,
* "_api_collection_operation_name"="reset",
* "_api_receive"=false
* }
* )
*/
public function resetAction(User $data): User {
//$this->userService->reset($data);
return $data;
}
/**
* @Route(
* name="user_token",
* path="api/user/token",
* methods={"POST"},
* defaults={
* "_api_resource_class"=User::class,
* "_api_collection_operation_name"="token",
* "_api_receive"=false
* }
* )
*/
public function tokenAction(User $data): User {
//$this->userService->reset($data);
return $data;
}到目前为止,一切都很好,然而……因为我们在这里使用的是post操作,而用户是doctrine实体,所以api-platform捆绑包自动将post添加到数据库中。但我不希望这样,我希望它将实体传递给控制器,然后控制器使用服务来执行业务逻辑。并确定是否以及如何处理该帖子。
现在我看了一下文档,问题似乎是WriteListener总是触发器,还有其他触发器(例如ReadListener、DeserializeListener和ValidateListener)可以通过_api_receive参数禁用。
这就留下了一个问题,有没有办法在特定的操作或路由上禁用WriteListener?
致以亲切的问候,Ruben van der Linde
发布于 2018-07-05 06:34:58
您可以返回HttpFoundation的Response而不是$data的实例。则不会调用在kernel.view上注册的任何侦听器。
但是为写监听器引入一个类似于api_receive的监听器是一个好主意。你介意打开一个拉取请求吗?
编辑:我已经打开了一个拉取请求,以引入这个新标志:https://github.com/api-platform/core/pull/2072
https://stackoverflow.com/questions/51147945
复制相似问题