Как проверить данные из поста в restful 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);    
}

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
4 861
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Спасибо, это именно то, что мне нужно. Сайт понравился, много полезной информации.

fajuchem 01.09.2018 22:33

Другие вопросы по теме