Пользовательская операция в платформе API не связывает сущность автоматически - PullRequest
1 голос
/ 24 марта 2019

Я добавляю пользовательскую операцию POST, как описано https://api -platform.com / docs / core / operations / # рекомендуемый метод

Но я каждый раз сталкиваюсь с ошибкой, говоря, что мое действие не находит мою сущность как услугу:

"hydra: description": "Невозможно автоматически передать аргумент $ user для \" App \ Controller \ SDK \ User \ UserCreateAction () \ ": он ссылается на класс \" App \ Entity \ SDK \ User \ ", но такой службы нет существует. "

Вот мое действие:

class UserCreateAction extends BaseAction
{
    private $userService;

    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }

    public function __invoke(User $user)
    {
        return $this->userService->create($user);
    }
}

Обычно действие должно автоматически распознавать сущность $ user

Ответы [ 2 ]

2 голосов
/ 24 марта 2019

Я понял, что это из-за моего services.yml.
На самом деле, среди ресурсов, которые должны быть доступны для использования в качестве службы, папка Entity/ была исключена:

App\:
    resource: '../src/*'
    exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

Итак, я изменил его, я удалил "Entity", и теперь он работает нормально: (РЕДАКТИРОВАТЬ: Пожалуйста, обратитесь к комментарию @Cerad ниже для исправления.)

App\:
    resource: '../src/*'
    exclude: '../src/{DependencyInjection,Migrations,Tests,Kernel.php}'
1 голос
/ 25 марта 2019

Это очень странный случай - вы пытаетесь создать пользователя, который уже существует (платформа 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);
    }
}

Чтобы понять, как это работает, прочитайте о ParamConverter в Symfony.Когда вы пытаетесь внедрить сущность в свой метод контроллера __invoke - платформа api пытается найти сущность по {id} в базе данных.Это применимо для операций с предметами.

 *     itemOperations={
 *         "custom": {
 *             "method": "GET",
 *             "path": "/users/{id}",
...