使用 StateProcessor 时 API 平台验证不起作用

问题描述 投票:0回答:1

我很好奇这是否是 API 平台的潜在问题/改进? 如您所知,API 平台有 状态处理器

但是如果您使用状态处理器,验证将不起作用。 这是我的代码:

public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = [])
{
    if ($operation instanceof Post && $data->getPlainPassword()) {
        $hashedPassword = $this->passwordHasher->hashPassword(
            $data,
            $data->getPlainPassword()
        );

        $data->setPassword($hashedPassword);
        $data->eraseCredentials();
    }

    return $this->processor->process($data, $operation, $uriVariables, $context);
}

在我的用户实体中,我使用

#[UniqueEntity('email')]
约束。 因此,如果我不在该处理器中使用 Symfony Validator,则会抛出异常。

An exception occurred while executing a query: Duplicate entry '[email protected]' for key 'user.UNIQ_8D93D649E7927C74'

所以解决办法是:

$errors = $this->validator->validate($data);

if (count($errors) > 0) {
    throw new ValidationException($errors);
}
php symfony api-platform.com
1个回答
0
投票

好吧,我找到了一个解决方案,确保在委托给内部处理器之前调用验证。您可以调用验证接口,直接在您的流程中使用它们。 如果您使用流程类,ApiPlatform 中的validationListener 将不再被调用,因此您必须自己在流程中设置这个小代码。

    <?php

    ....
    use Symfony\Component\Validator\Validator\ValidatorInterface;
    
    class MyProcessor implements ProcessorInterface
    {
        ...
        private ValidatorInterface $validator;
    
        public function __construct(...., ValidatorInterface $validator)
        {
            ....
            $this->validator = $validator;
        }
    
        public function process($data, Operation $operation, array $uriVariables = [], array $context = []): void
        {
            // Validate data
            $violations = $this->validator->validate($data);
            if (count($violations) > 0) {
                throw new \ApiPlatform\Exception\ValidationException($violations);
            }
    
            .....
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.