Предоставить контекст группы проверки с помощью Symfony / API Platform - PullRequest
2 голосов
/ 08 апреля 2020

Как я уже сказал в заголовке, я пытаюсь предоставить контекст проверки платформы Sf / Api.

Точнее, я хотел бы иметь разные группы проверки в зависимости от значения объекта.

Если я User с ROLE_PRO: тогда я хочу validate:pro и default в качестве групп проверки.

Если я User с ROLE_USER: тогда я хочу default в качестве группы проверки.

Я попытался создать событие, основанное на следующем событии API-платформы, но не могу найти способ предоставить ExecutionContextInterface с моими группами проверки

public static function getSubscribedEvents()
{
     return [
          KernelEvents::VIEW => ['addGroups', EventPriorities::PRE_VALIDATE],
     ];
}

1 Ответ

0 голосов
/ 09 апреля 2020

Как вы можете видеть в документации 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), а после этого вы изменяете контекстное удаление того, какой пользователь вошел в систему.

Спасибо!

...