Мне интересно, является ли это потенциальной проблемой/улучшением платформы 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);
}
В моей сущности User я использую ограничение #[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);
}
Хорошо, я нашел решение: убедитесь, что проверка вызывается перед делегированием внутреннему процессору. Вы можете вызвать интерфейс проверки прямо в своем процессе, чтобы использовать их там. Если вы используете классы процессов, то метод validationListener из ApiPlatform больше не вызывается, поэтому вам придется самостоятельно настроить этот небольшой код в своем процессе.
<?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);
}
.....
}
}
Спасибо за ваше исследование, я отмечу этот ответ как правильный, но в своем вопросе я использовал тот же подход. Похоже, другого способа, кроме как проверить данные прямо в процессоре, нет. Спасибо!
Я нашел ваши вопросы, исследуя свою проблему, у меня та же проблема с утверждением и процессором из руководства по медиа-объектам из самой документации платформы API (api-platform.com/docs/core/file-upload). Когда я найду решение, я опубликую его здесь. Я все еще расстроен. давайте держаться подальше :^)