我正在按照描述https://api-platform.com/docs/core/operations/#recommended-method
添加自定义POST操作但是我每次都遇到一个错误,说我的操作找不到我的实体作为服务:
“ hydra:description”:“无法自动装配\” App \ Controller \ SDK \ User \ UserCreateAction()\“的参数$ user:它引用类\” App \ Entity \ SDK \ User \“,但没有此类服务存在。”
这是我的动作:
<!DOCTYPE html>
<html>
<head>
<style>
a:link,
a:visited {
background-color: #f44336;
color: white;
padding: 15px 25px;
text-align: center;
text-decoration: none;
display: inline-block;
}
a:hover,
a:active {
background-color: lightblue;
}
</head>
</style>
<body>
<a href="http://amazon.com" target="_blank">
<img border="0" src="logo.jpg" width="69" height="36">
</a>
<a href="http://youtube.com" target="_blank">This is a link</a>
</body>
</html>
通常,该操作应自动识别$ user实体
答案 0 :(得分:1)
我意识到这是因为我的services.yml
。
实际上,在应该可以用作服务的资源中,Entity/
文件夹已被排除:
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
因此,我进行了更改,删除了“实体”,现在可以正常使用: (编辑:请参考下面@Cerad的评论以获取修复。)
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Migrations,Tests,Kernel.php}'
答案 1 :(得分:1)
这是一个非常奇怪的情况-您试图创建已经存在的用户(api平台从您的请求uri加载它)这是非法操作。从User $user
中删除__invoke
自变量并注入Request
:
class UserCreateAction extends BaseAction
{
private $userService;
public function __construct(UserService $userService)
{
$this->userService = $userService;
}
public function __invoke(Request $request)
{
$userFields = \json_decode($request->getContent(), true);
return $this->userService->create($userFields);
}
}
要了解其工作原理,请阅读symfony中的ParamConverter
。当您尝试将实体注入控制器__invoke方法时-api平台会尝试通过数据库中的{id}查找实体。这适用于项目操作。
* itemOperations={
* "custom": {
* "method": "GET",
* "path": "/users/{id}",
答案 2 :(得分:0)
就像任何常规控制器一样,确保可以注入服务:
# symfony/config/services.yaml
App\ApiPlatform\Controller\CreateBookPublication:
tags: ['controller.service_arguments']
和
<?php
// App\ApiPlatform\Controller\CreateBookPublication.php
namespace App\ApiPlatform\Controller;
use App\Entity\Book;
class CreateBookPublication
{
private $bookPublishingHandler;
public function __construct(BookPublishingHandler $bookPublishingHandler)
{
$this->bookPublishingHandler = $bookPublishingHandler;
}
public function __invoke(Book $data): Book
{
$this->bookPublishingHandler->handle($data);
return $data;
}
}