我很好奇这是否是 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);
}
好吧,我找到了一个解决方案,确保在委托给内部处理器之前调用验证。您可以调用验证接口,直接在您的流程中使用它们。 如果您使用流程类,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);
}
.....
}
}