#php #serialization #doctrine #mezzio #laminas
#php #сериализация #доктрина #mezzio #laminas
Вопрос:
В настоящее время мы работаем над использованием API laminas/mezzio
, и я хотел бы генерировать разные выходные данные для details
list
маршрутов и. Я ищу способ получения следующих результатов:
Список-ответ
{
"_total_items": 2,
"_page": 1,
"_page_count": 1,
"_links": {
"self": {
"href": "https://api.domain.tld/snapshot?page=1"
}
},
"_embedded": {
"snapshot": [
{
"id": "9c81ed3e-4ec4-4c5f-a3a1-d14e499b2607",
"name": "Lorem Ipsum 1"
},
{
"id": "6381ed3e-4ec4-4c5f-a3a1-d14e499b2633",
"name": "Lorem Ipsum 2"
}
]
}
}
Подробно-Ответ
{
"id": "9c81ed3e-4ec4-4c5f-a3a1-d14e499b2607",
"name": "Lorem Ipsum 1",
"foo": "bar",
"more": "fields"
}
Для этой цели я нашел пакет jms/serializer
. Я добавил все аннотации, требуемые сериализатором, и это работает. Но я немного запутался, как интегрировать этот пакет в laminas/mezzio
doctrine 2 и laminas/mezzio-hal
Мой обработчик списков:
<?php
class ListHandler implements RequestHandlerInterface
{
protected SnapshotServiceInterface $snapshotService;
protected HalResponseFactory $halResponseFactory;
protected ResourceGenerator $resourceGenerator;
protected int $itemsPerPage;
public function __construct(
array $config,
SnapshotServiceInterface $snapshotService,
HalResponseFactory $halResponseFactory,
ResourceGenerator $resourceGenerator
) {
$this->snapshotService = $snapshotService;
$this->halResponseFactory = $halResponseFactory;
$this->resourceGenerator = $resourceGenerator;
}
public function handle(ServerRequestInterface $request): ResponseInterface
{
$paramsQuery = $request->getQueryParams();
$paramsRoute = $request->getAttributes();
$params = array_merge($paramsQuery, $paramsRoute);
$itemsPerPage = (array_key_exists('itemsPerPage', $params)) ? (int)$params['itemsPerPage'] : $this->itemsPerPage;
$query = $this->snapshotService->getBy($params);
$paginator = new SnapshotListCollection($query->setMaxResults($itemsPerPage));
$resource = $this->resourceGenerator->fromObject($paginator, $request);
return $this->halResponseFactory->createResponse($request, $resource);
}
}
Мне, вероятно, нужен способ сообщить doctrine, как увлажнить мой SnapshotEntity. Я читал о «событии жизненного цикла», которое должно быть прикреплено к прослушивателю Doctrine. Но все учебные пособия, на которые я смотрю, написаны с учетом Symfony. Как я могу указать doctrine / mezzio / hal для гидратации моих объектов на основе разных маршрутов и с использованием сериализатора? Может кто-нибудь указать мне правильное направление?
Большое вам спасибо!
Комментарии:
1. В этом примере я не вижу, чтобы вы интегрировали JMS / Serializer. Вы можете создать объект value, который предоставит подробную информацию для List-Response и Details-Response, а затем вы можете попросить JMS / Serializer вывести их в формате JSON. Вероятно, вы можете реализовать это внутри своего halResponseFactory?