Как вы можете видеть в документации API-платформы (https://api-platform.com/docs/core/serialization/#changing -the-serialization-context-динамически ), вы можете динамически управлять группами проверки с помощью службы.
Прежде всего, в вашей конфигурации api-platform
вы должны определить группу проверки по умолчанию:
App\Class\MyClass:
properties:
id:
identifier: true
attributes:
input: false
normalization_context:
groups: ['default']
Вам необходимо определить новую службу, которая реализует SerializerContextBuilderInterface
class ContextBuilder implements SerializerContextBuilderInterface
{
private SerializerContextBuilderInterface $decorated;
private AuthorizationCheckerInterface $authorizationChecker;
public function __construct(SerializerContextBuilderInterface $decorated, AuthorizationCheckerInterface $authorizationChecker)
{
$this->decorated = $decorated;
$this->authorizationChecker = $authorizationChecker;
}
public function createFromRequest(Request $request, bool $normalization, ?array $extractedAttributes = null): array
{
$context = $this->decorated->createFromRequest($request, $normalization, $extractedAttributes);
if (isset($context['groups']) && $this->authorizationChecker->isGranted('ROLE_PRO') && true === $normalization) {
$context['groups'][] = 'validate:pro';
}
return $context;
}
}
Кроме того, вам необходимо настроить новую службу с помощью декоратора
App\Builder\ContextBuilder:
decorates: 'api_platform.serializer.context_builder'
arguments: [ '@App\Builder\ContextBuilder.inner' ]
Здесь происходит следующее:
Вы переопределяете ContextBuilder. Прежде всего вы создаете контекст из запроса и из конфигурации (первая строка метода createFromRequest
), а после этого вы изменяете контекстное удаление того, какой пользователь вошел в систему.
Спасибо!