PHP - Symfony 4 - Платформа API - Пользовательские операции

Использование платформы SF4 и Api: я хотел бы иметь маршрут для выполнения случайных вычислений и возврата результата клиенту... это кажется простым
Однако я не могу сделать это легко с пользовательскими операциями

Вот что я сделал

У меня есть объект для запроса и ответа, использующий нормализацию, чтобы поле было только в запросе, а не в ответе
И у меня есть мой контроллер с моей пользовательской операцией + соответствующий маршрут только для сбора (так как у меня нет идентификатора) в yaml в файле api_platform / resources.yaml
Контроллер принимает сущность на входе и отвечает ей, гидратировав результат

Я получаю ошибку:

2018-08-18T16:22:42+02:00 [critical] Uncaught PHP Exception ApiPlatform\Core\Exception\InvalidArgumentException: "Unable to generate an IRI for the item of type "App\Entity\Computation"" at /dev/git/app-api/vendor/api-platform/core/src/Bridge/Symfony/Routing/IriConverter.php line 127

Но я думаю, что это когда сервер сериализует ответ, так как вычисления выполняются (журналы внутри печатаются)

Entity \ Computation.php:

class Computation
{
/**
 * @var double  you input
 *
 * @Assert\NotBlank
 * @Groups({"read","write"})
 */
public $input;

/**
 * @var double the result
 *
 * @Groups({"read"})
 */
public $result;
}

Controller \ ComputationController.php:

class ComputationController
{
    private $service;

    public function __construct(MyService $service)
    {
        $this->service= $service;
    }

    public function __invoke(Position $data): Response
    {
        $this->service->compute($data);
        return $data;
    }
}

api_platform / resources.yaml:

resources:
  App\Entity\Computation:
    itemOperations: {}
    collectionOperations:
      compute:
        method: 'POST'
        path: '/compute'
        controller: 'App\Controller\ComputationController'
    attributes:
      normalization_context:
        groups: ['read']
      denormalization_context:
        groups: ['write']

Может ли кто-нибудь помочь мне с этим?
Спасибо!

1 ответ

Я нашел решение, пользовательские операции совершенно не способ сделать это..

В документации пользовательской операции говорится:

Примечание: система событий должна быть предпочтительнее пользовательских контроллеров, когда это применимо.

Таким образом, правильным способом выполнения простой, не связанной с сущностью операции является использование объекта передачи данных (DTO).

https://api-platform.com/docs/core/dto/

Надеется, что это может помочь кому-то,

У вас нет операции "получить", которая является обязательной. Вот почему Apip не может генерировать iri за вас.

Другие вопросы по тегам