0

コンテキストは、すべてのエンティティに影響を与えるエンティティのカスタム循環参照ハンドラーを設定しようとしているということです。

ドキュメント ( https://symfony.com/doc/current/components/serializer.html#handling-circular-references ) によると、ファイル内のサービスのcircular_reference_handler下に値を次のように設定するように案内されています。serializerconfig/packages/framework.yaml

framework:
    validation:
        enabled: true

    messenger:
        enabled: true

    assets:
        enabled: true

    serializer:
        circular_reference_handler: App\Services\CircularReferenceHandler
        enable_annotations: true

私の実際の問題は、シリアライザーが循環参照 ハンドラーをロードしようとすると、オーバーライドが存在しないように見えることです:

オーバーライドがコンテキストにまったく適用されないのはなぜですか??

私はしようとしました:

  • キャッシュをリロードする
  • API プラットフォーム パッケージの ContextBuilder クラスを使用する
  • ノーマライザーに適用する

どれも働いていません

私の 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()メソッドの使用時にカスタムの circle_reference_handler が適用されることを期待していましたが、実際には、このメソッドで受け取ったコンテキストには追加のキー/値のペアが含まれていません (例:['circular_reference_handler => App\Services\CircularReferenceHandler]

4

1 に答える 1