Контекст заключается в том, что я пытался настроить пользовательский обработчик циклических ссылок для моих сущностей, который будет влиять на ВСЕ сущности.
Согласно документации (https://symfony.com/doc/current/components/serializer.html#handling-circular-references), мы руководствуемся установкой значения circular_reference_handler
в службе serializer
в файле config/packages/framework.yaml
следующим образом:
framework:
validation:
enabled: true
messenger:
enabled: true
assets:
enabled: true
serializer:
circular_reference_handler: App\Services\CircularReferenceHandler
enable_annotations: true
Моя настоящая проблема заключается в том, что когда сериализатор пытается загрузить обработчик циклических ссылок, мое переопределение, кажется, не существует:
изображение, показывающее ссылку на ключ
изображение с пустым контекстом
Почему мое переопределение вообще не применяется к контексту ??
Я попытался:
- Перезагрузить кеш
- Используйте класс ContextBuilder из моего пакета API Platform
- Примените его в нормализаторе
Ни один из них не работал
Я показал вам мой yaml, но вот обработчик:
<?php
namespace App\Services;
class CircularReferenceHandler
{
/**
* @param object $object
* @return mixed
*/
public function __invoke($object)
{
return $object->getId();
}
}
и вот конструктор контекста, который я попытался использовать в качестве альтернативы:
<?php
namespace App\Serializer;
use ApiPlatform\Core\Serializer\SerializerContextBuilderInterface;
use App\Services\CircularReferenceHandler;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
final class GlobalSerializerContextBuilder implements SerializerContextBuilderInterface
{
/**
* Creates a serialization context from a Request.
*
* @param Request $request
* @param bool $normalization
* @param array|null $extractedAttributes
*
* @return array
*/
public function createFromRequest(Request $request, bool $normalization, array $extractedAttributes = null): array
{
$resourceClass = $context['resource_class'] ?? null;
$context[AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER] = CircularReferenceHandler::class;
return $context;
}
}
и вот где я зарегистрировал это ( doc ):
App\Serializer\GlobalSerializerContextBuilder:
decorates: 'api_platform.serializer.context_builder'
arguments: ['@App\Serializer\GlobalSerializerContextBuilder.inner']
autoconfigure: false
Я ожидал мой пользовательский циркуляр_референт_хандлер, который будет применен при использовании метода AbstractNormalizer->handleCircularReference()
, , но факт - контекст, полученный в этом методе, не включает мой дополнительный ключ / значение пара (например, ['circular_reference_handler => App\Services\CircularReferenceHandler]