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






Sale.Sale. В этом классе проверки вы должны перебирать свойство Sale.percentage и запускать логику проверки.Полные примеры для каждого пункта выше:
json на этой странице http://www.inanzzz.com/index.php/posts/symfonyAbstractController. Сделайте то, что UserController::create делает для вашего собственного контроллера. Он использует $this->data для демонстрационных целей в том же контроллере, но вы должны передать его службе и обработать его там.
Спасибо, это именно то, что мне нужно. Сайт понравился, много полезной информации.