Symfony Валидатор: проверка путем сравнения старого значения из БД - PullRequest
0 голосов
/ 22 января 2020

Я работаю с Symfony 4.4,

По соображениям безопасности при отправке сущности OrderProduct, которая встраивает сущность Product, я должен контролировать некоторые значения OrderProduct, взятые из Product.

Итак, это API Symfony, я получаю OrderProduct в формате JSON:

{
   "product" : { "id" : 82 },
   "price" : 9.7,
   "quantity": 3,
   //...
}

Мне нужно получить продукт из базы данных, чтобы проверить правильность цены.

Заказ товара:

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Я думаю, пользовательское ограничение проверки будет хорошим вариантом. В своем валидаторе пользовательских ограничений введите ProductRepository, найдите свою сущность и сравните необходимые значения. Возможно, создайте OrderProduct ограничение проверки для вашей сущности и проверьте несколько полей.

public function validate($orderProduct, Constraint $constraint)
{
    // a few checks 

    $product = $this->productRepository->find($orderProduct->getProduct()->getId());

    if (!$this->isPriceValid($product->getPrice(), $orderProduct->getPrice()) { 
        $this->context->buildViolation($constraint->message)
            ->atPath('price')
            ->addViolation();
    }

    // ...
}

public function isPriceValid(float $oldPrice, float $newPrice): bool
{
    return $oldPrice === $newPrice;
}
0 голосов
/ 22 января 2020
  1. Создайте ProductPriceConstraint и ProductPriceConstraintValidator, убедитесь, что вы используете валидатор в качестве сервиса
  2. Внедрите сервис EntityManager
  3. Запросите продукт, используя идентификатор из значения
  4. Сравните значения

Подробная информация о том, как создавать пользовательские валидаторы ограничений: https://symfony.com/doc/current/validation/custom_constraint.html

Примечание. Ваш валидатор должен быть валидатором ограничения класса, поэтому что вы можете получить доступ ко всем значениям, а не только к цене или свойству товара. https://symfony.com/doc/current/validation/custom_constraint.html#class -constraint-валидатор

...