如何全局定义 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
为了在实体中使用@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