Мне нужно проверить некоторые данные перед вставкой в базу данных, для этого я создаю небольшой сервис, который возвращает недопустимые поля от объекта. Работает нормально при проверке отдельных объектов.
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);
}
Кажется неправильным хранить подобную бизнес-логику в контроллере, но я не знаю, где ее разместить, я должен создать службу только для этого? тогда каждая конечная точка, которая имеет более сложную проверку, будет создавать новый сервис?