如何全局定义 API 平台中使用的 Serializer 配置

How to globally define configuration of Serializer used in API Platform

为了在实体中使用@MaxDepth 注释,enable_max_depth 属性 必须在序列化程序上下文中显式设置(例如在@ApiPlatform 注释的配置中),因此在实体级别, 所以对于每个实体

有没有办法为项目的所有实体定义此 属性 enable_max_depth=true?我们可以在 api-platform.yaml 中找到的东西看起来像这样:

api-platform:
    serializer:
        enable_max_depth: true

目前没有这样的全局选项(值得添加,欢迎PR)。 但是,you can register a SerializerContextBuilder 为所有资源自动添加此上下文条目:

<?php
namespace App\Serializer;

use ApiPlatform\Core\Serializer\SerializerContextBuilderInterface;
use Symfony\Component\HttpFoundation\Request;

final class MaxDepthContextBuilder implements SerializerContextBuilderInterface
{
    private $decorated;

    public function __construct(SerializerContextBuilderInterface $decorated)
    {
        $this->decorated = $decorated;
    }

    public function createFromRequest(Request $request, bool $normalization, ?array $extractedAttributes = null): array
    {
        $context = $this->decorated->createFromRequest($request, $normalization, $extractedAttributes);
        $context['enable_max_depth'] = true;

        return $context;
    }
}

然后将这个新的 class 注册为服务装饰器:

# api/config/services.yaml
services:
    # ...
    'App\Serializer\MaxDepthContextBuilder':
        decorates: 'api_platform.serializer.context_builder'
        autoconfigure: false
        autowire: true