better defaults

main
Robert 2 months ago
parent 8f1bb8a969
commit 75a77d7a09
  1. 27
      src/bootstrap/safer_io.php
  2. 12
      src/classes/attributes/validators/my_validator.php
  3. 139
      src/classes/traits/form_validator.php

@ -43,6 +43,7 @@ final class use_io {
public $input_type; public $input_type;
public $field_filter; public $field_filter;
public $escape_html; public $escape_html;
public bool $error_on_null = false;
public $validation_rule; public $validation_rule;
public $validation_message; public $validation_message;
public $skip_the_db; public $skip_the_db;
@ -91,6 +92,22 @@ final class safer_io {
protected function __construct() { protected function __construct() {
} }
// Get raw data for inputs, to be used by filters
public static function set_data_from(array|object $ao): void {
if (is_object($ao)) {
$a = get_object_vars($ao);
if ($a === false) {
return; // Error skip it
}
self::$DATA_INPUTS = array_merge(self::$DATA_INPUTS, $a);
return;
}
if (is_array($ao)) {
self::$DATA_INPUTS = array_merge(self::$DATA_INPUTS, $ao);
}
}
// Allow anything to set_data_inputs is desired here // Allow anything to set_data_inputs is desired here
public static function set_data_input(string $var_name, mixed $data_in): void { public static function set_data_input(string $var_name, mixed $data_in): void {
if (! isset(self::$DATA_INPUTS[$var_name])) { if (! isset(self::$DATA_INPUTS[$var_name])) {
@ -489,6 +506,16 @@ final class safer_io {
$safer_db_data = null; $safer_db_data = null;
$safer_html_data = null; $safer_html_data = null;
$meta[$input_field_name]['empty'] = true; $meta[$input_field_name]['empty'] = true;
$skiper = $a->error_on_null ?? false; // should match public defined var of false
if ($skiper) {
$ret['name'] = $input_field_name;
$ret['meta']['missing'][] = $input_field_name;
$ret['errors'][$input_field_name] = "Missing Field $input_field_name";
$ret['html'] = null;
$ret['db'] = false;
$ret['logic'] = false;
return $ret;
}
} else { } else {
$field_filter_resolved = $field_type->resolve(); $field_filter_resolved = $field_type->resolve();

@ -108,7 +108,15 @@ class my_validator {
} }
} }
public function validate(object $object, array $messages = []): void { /**
*
* @param object $object
* @param array $messages defined in trait
* @param type $default null avoids an error on no-entry, false gives errors on no-entry
* @return void
*/
public function validate(object $object, array $messages = [], $default = null): void {
$handlers = [ $handlers = [
Positive::class => function (string $name, $value, $attr, array $messages) { Positive::class => function (string $name, $value, $attr, array $messages) {
@ -185,7 +193,7 @@ $handlers = [
foreach ($ref->getProperties() as $property) { foreach ($ref->getProperties() as $property) {
$name = $property->getName(); $name = $property->getName();
$property->setAccessible(true); $property->setAccessible(true);
$value = $property->getValue($object); $value = $property->getValue($object) ?? $default;
foreach ($property->getAttributes() as $attribute) { foreach ($property->getAttributes() as $attribute) {
$class = $attribute->getName(); $class = $attribute->getName();

@ -31,124 +31,123 @@ trait form_validator {
'valid_domain' => 'The %s domain name is not active', 'valid_domain' => 'The %s domain name is not active',
]; ];
/**
*
* @param array $data
* @param string $field
* @param mixed return: null avoids an error on no-entry; false gives errors on no-entry; default is the value
*/
private static function check_if_empty(array $data, string $field) {
$d = $data[$field] ?? null;
return match($d) {
null => true, // Pass validation as null or value unset
false => false, // Fail validation as user requested false on default
default => $d // Use value
};
}
private static function is_positive(array $data, string $field): bool { private static function is_positive(array $data, string $field): bool {
return (intval($data[$field]) >= 0) ? true : false; $r = self::check_if_empty($data, $field);
if (is_bool($r)) return $r;
return (intval($r) >= 0) ? true : false;
} }
private static function is_required(array $data, string $field): bool { private static function is_required(array $data, string $field): bool {
if (isset($data[$field])) { $r = self::check_if_empty($data, $field);
if (common::get_count($data[$field])) { if (is_bool($r)) return $r;
return false; // Should not be an array here
} if (common::get_count($r)) {
if (is_string($data[$field])) { return false; // Should not be an array here
return (trim($data[$field]) !== ''); }
} if (is_string($r)) {
if (is_int($data[$field])) { return (trim($r) !== '');
return true; }
} if (is_int($r)) {
return true;
} }
return false;
} }
private static function is_email(array $data, string $field): bool { private static function is_email(array $data, string $field): bool {
if (empty($data[$field])) { $r = self::check_if_empty($data, $field);
return true; if (is_bool($r)) return $r;
} return (filter_var($r, FILTER_VALIDATE_EMAIL) === false) ? false : true;
return (filter_var($data[$field], FILTER_VALIDATE_EMAIL) === false) ? false : true;
} }
private static function is_min(array $data, string $field, string $min): bool { private static function is_min(array $data, string $field, string $min): bool {
if (!isset($data[$field])) { $r = self::check_if_empty($data, $field);
return true; if (is_bool($r)) return $r;
} return mb_strlen($r) >= intval($min);
return mb_strlen($data[$field]) >= intval($min);
} }
private static function is_max(array $data, string $field, string $max): bool { private static function is_max(array $data, string $field, string $max): bool {
if (!isset($data[$field])) { $r = self::check_if_empty($data, $field);
return true; if (is_bool($r)) return $r;
} return mb_strlen($r) <= intval($max);
return mb_strlen($data[$field]) <= intval($max);
} }
private static function is_greater_than(array $data, string $field, string $min): bool { private static function is_greater_than(array $data, string $field, string $min): bool {
if (!isset($data[$field])) { $r = self::check_if_empty($data, $field);
return true; if (is_bool($r)) return $r;
} return intval($r) > intval($min);
return intval($data[$field]) > intval($min);
} }
private static function is_less_than(array $data, string $field, string $max): bool { private static function is_less_than(array $data, string $field, string $max): bool {
if (!isset($data[$field])) { $r = self::check_if_empty($data, $field);
return true; if (is_bool($r)) return $r;
} return intval($r) < intval($max);
return intval($data[$field]) < intval($max);
} }
private static function is_number_range(array $data, string $field, string $min, string $max): bool { private static function is_number_range(array $data, string $field, string $min, string $max): bool {
$r = self::check_if_empty($data, $field);
if (!isset($data[$field])) { if (is_bool($r)) return $r;
return true; $no = intval($r);
}
$no = intval($data[$field]);
return $no >= intval($min) && $no <= intval($max); return $no >= intval($min) && $no <= intval($max);
} }
private static function is_between(array $data, string $field, string $min, string $max): bool { private static function is_between(array $data, string $field, string $min, string $max): bool {
if (!isset($data[$field])) { $r = self::check_if_empty($data, $field);
return true; if (is_bool($r)) return $r;
} $len = mb_strlen($r);
$len = mb_strlen($data[$field]);
return $len >= intval($min) && $len <= intval($max); return $len >= intval($min) && $len <= intval($max);
} }
private static function is_same(array $data, string $field, string $other): bool { private static function is_same(array $data, string $field, string $other): bool {
if (isset($data[$field]) && isset($data[$other])) { $r = self::check_if_empty($data, $field);
return $data[$field] === $data[$other]; if (is_bool($r)) return $r;
if (isset($data[$other])) {
return $r === $data[$other];
} }
return false; return false;
} }
private static function is_alphanumeric(array $data, string $field): bool { private static function is_alphanumeric(array $data, string $field): bool {
if (!isset($data[$field])) { $r = self::check_if_empty($data, $field);
return true; if (is_bool($r)) return $r;
} return ctype_alnum($r);
return ctype_alnum($data[$field]);
} }
private static function is_secure(array $data, string $field): bool { private static function is_secure(array $data, string $field): bool {
if (!isset($data[$field])) { $r = self::check_if_empty($data, $field);
return false; if (is_bool($r)) return $r;
}
// Is 8 to 64 CHRs // Is 8 to 64 CHRs
$pattern = "#.*^(?=.{8,64})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\W).*$#"; $pattern = "#.*^(?=.{8,64})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\W).*$#";
return preg_match($pattern, $data[$field]); return preg_match($pattern, $r);
} }
private static function is_valid_email_domain(array $data, string $field): bool { private static function is_valid_email_domain(array $data, string $field): bool {
if (!isset($data[$field])) { $r = self::check_if_empty($data, $field);
return false; if (is_bool($r)) return $r;
} $domain = ltrim(stristr($r, '@'), '@') . '.';
$domain = ltrim(stristr($data[$field], '@'), '@') . '.';
return checkdnsrr($domain, 'MX'); return checkdnsrr($domain, 'MX');
} }
private static function is_valid_domain(array $data, string $field): bool { private static function is_valid_domain(array $data, string $field): bool {
if (!isset($data[$field])) { $r = self::check_if_empty($data, $field);
return false; if (is_bool($r)) return $r;
} return checkdnsrr($r, 'A')
|| checkdnsrr($r, 'AAAA')
return checkdnsrr($data[$field], 'A') || checkdnsrr($r, 'CNAME');
|| checkdnsrr($data[$field], 'AAAA')
|| checkdnsrr($data[$field], 'CNAME');
} }
} }
Loading…
Cancel
Save