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 за вас.