API Platform中的自定义操作不会自动关联实体

时间:2019-03-24 14:01:26

标签: php api symfony api-platform.com

我正在按照描述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实体

3 个答案:

答案 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;
    }
}