-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Description
I used PHPStorm to add return types, parameter types and property types; and do a bunch of spelling fixes! I'd do a pull request but I feel like this is a lot faster.
Note that this is untested as of right nowand I also automatically formatted the file which may have changed a bunch of formatting, hopefully for the better!
<?php
/**
* @link https://github.com/devwithkunal/php-validator-class
* @license https://github.com/devwithkunal/php-validator-class/blob/main/LICENSE
*/
class Validator
{
/**
* @var array $data - Data to validate.
*/
private array $data;
/**
* @var string $current_field - Current selected key/field to validate data.
*/
private string $current_field;
/**
* @var string $current_alias - Alias use on error messages instead of field name.
*/
private string $current_alias;
/**
* @var array $response_messages - Error messages to show user.
*
* You can change messages from here. User "{field}" to refer the field name.
*/
private array $response_messages = [
"required" => "{field} is required.",
"alpha" => "{field} must contains alphabetic characters only.",
"alpha_num" => "{field} must contains alphabetic characters & numbers only.",
"numeric" => "{field} must contains numbers only.",
"email" => "{field} is invalid.",
"max_len" => "{field} is too long.",
"min_len" => "{field} is too short.",
"max_val" => "{field} is too high.",
"min_val" => "{field} is too low.",
"enum" => "{field} is invalid.",
"equals" => "{field} does not match.",
"must_contain" => "{field} must contains {chars}.",
"match" => "{field} is invalid.",
"date" => "{field} is invalid.",
"date_after" => "{field} date is not valid.",
"date_before" => "{field} date is not valid.",
];
/**
* @var array $error_messages - Error message generated after validation of each field.
*/
public array $error_messages = [];
/**
* @var boolean $next - Check if next validation on the field should run or not.
*/
private bool $next = true;
/**
* Validator - Create new instance of Validator class.
*
* @param array $data - Data to validate.
*/
function __construct(array $data)
{
$this->data = $data;
}
/**
* add_error_message - Create and add error message after each validation failed.
*
* @param string $type - Key of $response_messages array.
* @return void
*/
private function add_error_message(string $type, $others = [])
{
$field_name = $this->current_alias ? ucfirst($this->current_alias) : ucfirst($this->current_field);
$msg = str_replace('{field}', $field_name, $this->response_messages[$type]);
foreach ($others as $key => $val) {
$msg = str_replace('{' . $key . '}', $val, $msg);
}
$this->error_messages[$this->current_field] = $msg;
}
/**
* exists - Check if the current field or field value exists or not.
*
* @return boolean
*/
private function exists(): bool
{
if (!isset($this->data[$this->current_field]) || !$this->data[$this->current_field]) {
return false;
}
return true;
}
/**
* set_response_messages - Function to set/extend custom error response messages.
*
* @param array $messages
* @return void
*/
function set_response_messages(array $messages)
{
foreach ($messages as $key => $val) {
$this->response_messages[$key] = $val;
}
}
/**
* field - Set the field name to start validation.
*
* @param string $name - Name of the field/key as on data to validate.
* @param string|null $alias - (optional) Alias use on error messages instead of field name.
* @return self
*/
function field(string $name, string $alias = null): Validator
{
$this->current_field = $name;
$this->next = true;
$this->current_alias = $alias;
return $this;
}
/**
* required - Check if the value exists.
*
* @return self
*/
function required(): Validator
{
if (!$this->exists()) {
$this->add_error_message('required');
$this->next = false;
}
return $this;
}
/**
* alpha - Check if the value is alpha only.
*
* @param array $ignore - (Optional) add characters to allow.
* @return self
*/
function alpha(array $ignore = []): Validator
{
if ($this->next && $this->exists() && !ctype_alpha(str_replace($ignore, '', $this->data[$this->current_field]))) {
$this->add_error_message('alpha');
$this->next = false;
}
return $this;
}
/**
* alpha_num - Check if the value is alphanumeric only.
*
* @param array $ignore - (Optional) add characters to allow.
* @return self
*/
function alpha_num(array $ignore = []): Validator
{
if ($this->next && $this->exists() && !ctype_alnum(str_replace($ignore, '', $this->data[$this->current_field]))) {
$this->add_error_message('alpha_num');
$this->next = false;
}
return $this;
}
/**
* numeric - Check if the value is numeric only.
*
* @return self
*/
function numeric(): Validator
{
if ($this->next && $this->exists() && !is_numeric($this->data[$this->current_field])) {
$this->add_error_message('numeric');
$this->next = false;
}
return $this;
}
/**
* email - Check if the value is a valid email.
*
* @return self
*/
function email(): Validator
{
if ($this->next && $this->exists() && !filter_var($this->data[$this->current_field], FILTER_VALIDATE_EMAIL)) {
$this->add_error_message('email');
$this->next = false;
}
return $this;
}
/**
* max_len - Check if length of the value is larger than the limit.
*
* @param int $size - Max length of characters of the value.
* @return self
*/
function max_len(int $size): Validator
{
if ($this->next && $this->exists() && strlen($this->data[$this->current_field]) > $size) {
$this->add_error_message('max_len');
$this->next = false;
}
return $this;
}
/**
* min_len - Check if length of the value is smaller than the limit.
*
* @param int $size - Min length of characters of the value.
* @return self
*/
function min_len(int $size): Validator
{
if ($this->next && $this->exists() && strlen($this->data[$this->current_field]) < $size) {
$this->add_error_message('min_len');
$this->next = false;
}
return $this;
}
/**
* max_val - Check if the value of integer/number is not larger than limit.
*
* @param int $val - Max value of the number.
* @return self
*/
function max_val(int $val): Validator
{
if ($this->next && $this->exists() && $this->data[$this->current_field] > $val) {
$this->add_error_message('max_val');
$this->next = false;
}
return $this;
}
/**
* min_val - Check if the value of integer/number is not smaller than limit.
*
* @param int $val - Min value of the number.
* @return self
*/
function min_val(int $val): Validator
{
if ($this->next && $this->exists() && $this->data[$this->current_field] < $val) {
$this->add_error_message('min_val');
$this->next = false;
}
return $this;
}
/**
* enum - Check if the value is in the list.
*
* @param array $list - List of valid values.
* @return self
*/
function enum(array $list): Validator
{
if ($this->next && $this->exists() && !in_array($this->data[$this->current_field], $list)) {
$this->add_error_message('enum');
$this->next = false;
}
return $this;
}
/**
* equals - Check if the value is equal.
*
* @param mixed $value - Value to match equal.
* @return self
*/
function equals($value): Validator
{
if ($this->next && $this->exists() && !$this->data[$this->current_field] == $value) {
$this->add_error_message('equals');
$this->next = false;
}
return $this;
}
/**
* date - Check if the value is a valid date.
*
* @param mixed $format - format of the date. (ex. Y-m-d) Check out https://www.php.net/manual/en/datetime.format.php for more.
* @return self
*/
function date($format = 'Y-m-d'): Validator
{
if ($this->next && $this->exists()) {
$dateTime = \DateTime::createFromFormat($format, $this->data[$this->current_field]);
if (!($dateTime && $dateTime->format($format) == $this->data[$this->current_field])) {
$this->add_error_message('date');
$this->next = false;
}
}
return $this;
}
/**
* date_after - Check if the date appeared after the specified date.
*
* @param mixed $date - Use format Y-m-d (ex. 2023-01-15).
* @return self
*/
function date_after($date): Validator
{
if ($this->next && $this->exists() && strtotime($date) >= strtotime($this->data[$this->current_field])) {
$this->add_error_message('date_after');
$this->next = false;
}
return $this;
}
/**
* date_before - Check if the date appeared before the specified date.
*
* @param mixed $date - Use format Y-m-d (ex. 2023-01-15).
* @return self
*/
function date_before($date): Validator
{
if ($this->next && $this->exists() && strtotime($date) <= strtotime($this->data[$this->current_field])) {
$this->add_error_message('date_before');
$this->next = false;
}
return $this;
}
/**
* must_contain - Check if the value must contain some characters.
*
* @param string $chars - Set of chars in one string ex. "@#$&abc123".
* @return self
*/
function must_contain(string $chars): Validator
{
if ($this->next && $this->exists() && !preg_match("/[" . $chars . "]/i", $this->data[$this->current_field])) {
$this->add_error_message('must_contain', ['chars' => $chars]);
$this->next = false;
}
return $this;
}
/**
* match - Check if the value matches a pattern.
*
* @param string $pattern - Regex pattern to match.
* @return self
*/
function match(string $pattern): Validator
{
if ($this->next && $this->exists() && !preg_match($pattern, $this->data[$this->current_field])) {
$this->add_error_message('match');
$this->next = false;
}
return $this;
}
/**
* is_valid - Check if all validations is successful.
*
* @return boolean
*/
function is_valid(): bool
{
return count($this->error_messages) == 0;
}
}Metadata
Metadata
Assignees
Labels
No labels