Как проверить данные из поста в успокоительном API - PullRequest
0 голосов
/ 01 сентября 2018

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

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);    
}

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

1 Ответ

0 голосов
/ 01 сентября 2018
  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 в демонстрационных целях на том же контроллере, но вы должны передать его службе и обработать там.
...