У меня проблема с платформой Api и пользовательской операцией сбора, когда мне нужно вручную указать аргумент в маршруте.
- Моя первая задача - получить на этом маршруте GET:
query/userjob/[USER UUID]
иполучить коллекцию всех заданий для данного пользователя. - Моя вторая задача - получить GET на
query/userjob/[USER UUID]/[JOB UUID]
и получить сведения о задании данного пользователя.
Возможно,важно сказать, что у меня нет ни ресурса Api, ни объекта сущности User, поэтому я исключаю все виды сопоставления или запроса подресурса.
Итак, допустим, у меня есть сопоставленный с UserJob ApiResource, как показано ниже:
App\Domain\User\Projection\UserJob:
itemOperations:
get:
method: 'GET'
path: '/userjob/{userId}/{jobId}'
requirements:
userId: '%uuid_regex%'
jobId: '%uuid_regex%'
collectionOperations:
get:
method: 'GET'
path: '/userjob/{userId}'
requirements:
userId: '%uuid_regex%'
attributes:
route_prefix: "/query"
В классе у меня есть:
final class UserJob
{
public $id; //int Auto inc
public $userId; //a UUID
public $jobId; //a UUID
public function __construct($userId, $jobId)
{
$this->userId = $userId;
$this->jobId = $jobId;
}
public function getId(): int
{
return $this->id;
}
public function getUserId()
{
return $this->userId;
}
public function getJobId()
{
return $this->jobId
}
Я построил пользовательский поставщик данных для этого класса, в котором я написал способ получения ресурса из параметра giver (userId):
public function getCollection(string $resourceClass, string $operationName = null)
{
$userId = $this->request->getCurrentRequest()->attributes->get('userId');
return $this->repository->entityManager->getRepository($resourceClass)->findByUserId($userId);
}
Когда я выполняю GET-вызов, скажем, query/userjob/148e3200-f793-447b-bde8-af6b7b27372c
, он выдает исключение:
Невозможно сгенерировать IRI для App \ Domain \ User \ Projection \ UserJob
А если я отладу глубже, в IRIConverterкласс, я считаю, что исходное исключение выдается из маршрутизатора:
Отсутствуют некоторые обязательные параметры ("userId") для создания URL для маршрута "api_user_jobs_get_collection".
Тем не менее, если я дам дамп результата $this->repository->entityManager->getRepository($resourceClass)->findByUserId($userId);
, все элементы, которые я ищу, будут хорошо извлечены из базы данных.
Так что моя интуиция заключается в том, что каким-то образом процесс ApiPlatform не может создать IRI коллекции, которую мыобычно можно найти в начале полезной нагрузки, и в моем случае это будет query/userjob/148e3200-f793-447b-bde8-af6b7b27372c
.
И происходит сбой во время процесса нормализации или сериализации, потому что «дополнительный» параметр моей пользовательской операции (пользовательский UUID) не передается нормализатору коллекции, классам конвертера iri, поэтому он не имеет возможностипередайте маршрутизатору пропущенный параметр для построения маршрута " api_user_jobs_get_collection ".
Чего мне здесь не хватает?Это общеизвестная проблема, у которой есть готовое решение, которое я пропустил?
Или мне нужно искать:
- украшать преобразователь IRI?
- использовать пользовательский нормализатор?
- делать что-то с композитными идентификаторами?
- что-то еще?