Skip to content

Updated with spelling fixes, return types, parameter types and property types #1

@MichelJonkman

Description

@MichelJonkman

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

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions