$definition * @param array $answers * @return array */ public function validate(array $definition, array $answers): array { $fields = $definition['fields']; $keys = array_column($fields, 'key'); $rules = ['answers' => $keys === [] ? 'present|array|max:0' : 'present|array:'.implode(',', $keys)]; foreach ($fields as $field) { $path = 'answers.'.$field['key']; $presence = $field['required'] ? 'required' : 'nullable'; $rules[$path] = $presence.'|'.match ($field['type']) { 'location' => 'array:province,district,locality', 'number' => 'numeric', 'date' => 'date_format:Y-m-d', 'email' => 'email|max:254', default => 'string|max:5000', }; if ($field['type'] === 'location') { foreach (['province', 'district', 'locality'] as $part) { $rules[$path.'.'.$part] = 'required_with:'.$path.'|string|max:150'; } } } return Validator::make(['answers' => $answers], $rules, [], [ 'answers.availability_location' => 'local de disponibilidade', 'answers.availability_location.province' => 'provĂ­ncia', 'answers.availability_location.district' => 'distrito', 'answers.availability_location.locality' => 'localidade', ])->validate()['answers']; } }