Как проверить данные из поста в успокоительном API

Мне нужно проверить некоторые данные перед вставкой в ​​базу данных, для этого я создаю небольшой сервис, который возвращает недопустимые поля от сущности. Это работает нормально при проверке отдельных объектов.

class EntityValidator
{
protected $validator;

public function __construct(ValidatorInterface $validator)
{
$this->validator = $validator;
}

public function validate($entity)
{
$errors = $this->validator->validate($entity);
$response = null;
if ($errors->count()) {
foreach ($errors as $error) {
$response[$error->getPropertyPath()] = $error->getMessage();
}
}

return $response;
}
}

Но я изо всех сил пытался проверить более сложные проблемы, например:
Это успокоительная конечная точка API, которая получает json с user_id и процентом в теле сообщения, она проверит сущность, чтобы увидеть, правильно ли она сопоставлена ​​с ограничителями валидатора Symfony.

public function create(Request $request, EntityValidator $entityValidator)
{
$data = json_decode($request->getContent(), true);
$entityExample = new EntityExample();
$entityExample
->setUserId($data['user_id'])
->setPercentage($data['percentage'])
;
$errors = $entityValidator->validate($entityExample);
// .. do other things ..
return new JsonResponse($errors);
}

Но давайте скажем, что я получаю массив данных и собираюсь вставлять много строк за раз, и есть бизнес-логика, которая говорит: «сумма процента пользователя должна быть 100»

public function create(Request $request, EntityValidator $entityValidator)
{
$data = json_decode($request->getContent(), true);
$totalPercentage = 0;
foreach ($data as $element) {
$entityExample = new EntityExample();
$entityExample
->setUserId($element['user_id'])
->setPercentage($element['percentage'])
;
$totalPercentage += $element['percentage'];
}
$errors = $entityValidator->validate($entityExample);
if ($totalPecentage != 100) {
$errors[] = 'Sum of percentage must be 100';
}
// .. do other things ..
return new JsonResponse($errors);
}

Кажется неправильным хранить подобную бизнес-логику в контроллере, но я не знаю, где ее разместить. Нужно ли создавать службу только для этого? тогда каждая конечная точка, которая имеет более сложную проверку, будет создавать новый сервис?

0

Решение

  1. Создайте модельное представление полезной нагрузки вашего запроса JSON. Модель с публичными свойствами и больше ничего. например Допустим, модель называется Sale,
  2. Создать кастом Ограничение валидации который будет связан с Sale модель. В этом классе валидации вы будете перебирать Sale.percentage свойство и запустить вашу логику проверки.
  3. В вашем контроллере вы вызываете компонент сериализатора и компонент валидатора для проверки запроса.

Полные примеры для каждого пункта выше:

  1. Обе ссылки ниже имеют примеры моделей, но если вы хотите больше примеров, просто нажмите Ctrl + F json на этой странице http://www.inanzzz.com/index.php/posts/symfony
  2. Пользовательское ограничение проверки уровня класса в Symfony
  3. Простой способ обработки запросов, ответов и исключений в Symfony API. Скопируйте и не трогайте AbstractController, Что делать UserController::create делает для вашего собственного контроллера. Он использует $this->data для демонстрационных целей в том же контроллере, но вы должны передать его службе и обработать там.
2

Другие решения

Других решений пока нет …