升級到 Api 平臺 2.6 后,非ApiResource物體開始被序列化(ld-json)以及假識別符號及其型別。例如:
{
"@type": "MetaData",
"@id": "_:11294",
"id": "bf1e417c-27ff-48c1-a591-40e5a43c708c",
"key": "key1",
"value": "value1"
}
我們想洗掉這些欄位。為此,我嘗試實作一個自定義規范器,希望能夠在物件轉換為陣列之后和陣列轉換為 json 之前掛鉤。
查看已注冊的規范化器:
----------------------------------------------------------- ---------- ---------------------------------------------------------------------------
Service ID priority Class name
----------------------------------------------------------- ---------- ---------------------------------------------------------------------------
api_platform.serializer.normalizer.item -895 ApiPlatform\Core\Serializer\ItemNormalizer
api_platform.problem.normalizer.constraint_violation_list -780 ApiPlatform\Core\Problem\Serializer\ConstraintViolationListNormalizer
api_platform.hydra.normalizer.collection_filters -985 ApiPlatform\Core\Hydra\Serializer\CollectionFiltersNormalizer
api_platform.hydra.normalizer.error -800 ApiPlatform\Core\Hydra\Serializer\ErrorNormalizer
api_platform.hydra.normalizer.entrypoint -800 ApiPlatform\Core\Hydra\Serializer\EntrypointNormalizer
api_platform.hydra.normalizer.constraint_violation_list -780 ApiPlatform\Core\Hydra\Serializer\ConstraintViolationListNormalizer
api_platform.hydra.normalizer.documentation -800 ApiPlatform\Core\Hydra\Serializer\DocumentationNormalizer
api_platform.jsonld.normalizer.object -995 ApiPlatform\Core\JsonLd\Serializer\ObjectNormalizer
api_platform.swagger.normalizer.api_gateway -780 ApiPlatform\Core\Swagger\Serializer\ApiGatewayNormalizer
api_platform.openapi.normalizer.api_gateway -780 ApiPlatform\Core\Swagger\Serializer\ApiGatewayNormalizer
api_platform.serializer.uuid_denormalizer ApiPlatform\Core\Bridge\RamseyUuid\Serializer\UuidDenormalizer
serializer.denormalizer.array -990 Symfony\Component\Serializer\Normalizer\ArrayDenormalizer
serializer.normalizer.object -1000 Symfony\Component\Serializer\Normalizer\ObjectNormalizer
serializer.normalizer.problem -890 Symfony\Component\Serializer\Normalizer\ProblemNormalizer
serializer.normalizer.json_serializable -900 Symfony\Component\Serializer\Normalizer\JsonSerializableNormalizer
serializer.normalizer.datetime -910 Symfony\Component\Serializer\Normalizer\DateTimeNormalizer
serializer.normalizer.data_uri -920 Symfony\Component\Serializer\Normalizer\DataUriNormalizer
serializer.normalizer.dateinterval -915 Symfony\Component\Serializer\Normalizer\DateIntervalNormalizer
serializer.normalizer.datetimezone -915 Symfony\Component\Serializer\Normalizer\DateTimeZoneNormalizer
serializer.normalizer.constraint_violation_list -915 Symfony\Component\Serializer\Normalizer\ConstraintViolationListNormalizer
api_platform.problem.normalizer.error -810 ApiPlatform\Core\Problem\Serializer\ErrorNormalizer
----------------------------------------------------------- ---------- ---------------------------------------------------------------------------
我得到的最接近的是,api_platform.jsonld.normalizer.object但是如果我使用的優先級是-994,我會得到原始物件,如果我使用-996,我會得到單個字串/布爾/數字欄位(所以在規范化之后)。
有什么方法可以獲得關聯陣列,以便如果@id 以 開頭,我可以洗掉@id 和@type _:?
添加這些屬性的代碼行似乎是這樣,但是可能只是添加到背景關系中,它不包括規范化陣列中的這些欄位。
uj5u.com熱心網友回復:
不知道如何裝飾序列化程式,但我會用事件訂閱者處理您的問題。
“POST_SERIALIZE”優先級包含序列化的回應正文,您可以獲取并修改它。
像這樣:
<?php
namespace App\EventSubscriber;
use ApiPlatform\Core\EventListener\EventPriorities;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class PostSerializeProductEventSubScriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
KernelEvents::VIEW => ["removeFakeIdentifiersFromJsonLdResponseBody", EventPriorities::POST_SERIALIZE],
];
}
public function removeFakeIdentifiersFromJsonLdResponseBody(ViewEvent $event): void
{
$requestAcceptHeader = $event->getRequest()->headers->get('accept', 'none');
if (str_contains($requestAcceptHeader, "application/ld json")) {
$this->removefakeIdentifiersFromResponseBody($event);
}
}
private function removefakeIdentifiersFromResponseBody(ViewEvent $event): void
{
$responseBody = $event->getControllerResult();
$decodedResponseBody = json_decode($responseBody);
$this->removeFakeIdentifiersFromObject($decodedResponseBody);
$encodedResponseBody = json_encode($decodedResponseBody);
$event->setControllerResult($encodedResponseBody);
}
private function removeFakeIdentifiersFromObject(object $responseBody): void
{
foreach ($responseBody as $property => $value) {
$this->removeFakeIdRecursively($property, $value, $responseBody);
}
}
private function removeFakeIdRecursively(string $property, mixed $value, object $responseBody): void
{
if ($property === "@id" && str_starts_with($value, "_:")) {
unset($responseBody->$property);
} elseif (is_object($value)) {
$this->removeFakeIdentifiersFromObject($value);
} elseif (is_array($value)) {
foreach ($value as $object) {
if (is_object($object)) {
$this->removeFakeIdentifiersFromObject($object);
}
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/427362.html
