<?php namespace App\Requests; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Validator\ConstraintViolation; use Symfony\Component\Validator\Validator\ValidatorInterface; abstract class BaseRequest { public function __construct(protected ValidatorInterface $validator) { $this->populate(); if ($this->autoValidateRequest()) { $this->validate(); } } public function validate(): void { $errors = $this->validator->validate($this); $messages = ['message' => 'validation_failed', 'errors' => []]; /** @var ConstraintViolation $errors */ foreach ($errors as $message) { $messages['errors'][] = [ 'property' => $message->getPropertyPath(), 'value' => $message->getInvalidValue(), 'message' => $message->getMessage(), ]; } if (count($messages['errors']) > 0) { $response = new JsonResponse($messages, 201); $response->send(); exit; } } public function getRequest(): Request { return Request::createFromGlobals(); } protected function populate(): void { foreach ($this->getRequest()->request->all() as $property => $value) { if (property_exists($this, $property)) { $this->{$property} = $value; } } } protected function autoValidateRequest(): bool { return true; } }