Как сериализовать объект в laminas / mezzio с помощью doctrine и jms / serializer

#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?