@3dben

Как дописать валидатор?

Привет. Пишу свой велосипед т.е. OOP, MVC фреймворк. В процессе решил не писать проверки в моделе Аккаунта, а написать отдельный класс валидации форм (в итоге я его стащил с github =)).

Идея заключалась в том, что к полю можно применить несколько методов валидации, допустим:
  1. Поле логин обязательно к заполнению.
  2. Логин должен состоять только из русскиз букв.
  3. Логин должен состоять не менее чем из 3-х символов.


То есть чтобы для каждого неверного действия вываливалось по 1-му сообщению, а не пачкой или вообще в одну строчку.

Код, который я нарыл рабочий на 100%, но в итоге столкнулся с тем, что не могу с помощью этого класса проверить, скажем email на существовании в БД…

В ситуации, когда в базе данных уже есть такой пароль, email или логин нужно показать сообщение, что таковые имеются, но я не доганяю, что нужно делать. Лезть в БД в этом класе нет смысла, потому что это задача модели аккаунта.

В этом классе возможно сделать такие проверки? Может подскажите другой класс примерно такой же сложности.

В общем буду рад любому дельному совету.

Код валидатора:
<?php

namespace components\libs;

class Validator
{
    private $field_name;
    private $message;
    private $type_of_rule;
    private $param;
    private static $rules = [];
    private static $fields = [];
    private static $errors = [];


    public function __construct($field_name, $message, $type_of_rule, $param)
    {
        $this->field_name = $field_name;
        $this->message = $message;
        $this->type_of_rule = $type_of_rule;
        $this->param = $param;
    }

    public static function addRule($field_name, $message, $type_of_rule, $param = null)
    {
        self::$rules[] = new Validator($field_name, $message, $type_of_rule, $param);
    }

    public static function addEntries($fields) {
        foreach ($fields as $fieldname => $value) {
            self::$fields[$fieldname] = self::sanitize($value);
        }
    }

    public static function validate() {
        foreach (self::$rules as $rule) {
            self::testRule($rule);
        }
    }

    public static function sanitize($text)
    {
        $text = trim(strip_tags($text));

        if (get_magic_quotes_gpc()) {
            $text = stripslashes($text);
        }
        return $text;
    }
    
    public static function getErrors()
    {
        if (count(self::$errors)) {
            return self::$errors;
        }
        return false;
    }

    public static function longerThan($value, $min)
    {
        if (strlen($value) >= $min) {
            return true;
        }
        return false;
    }

    public static function shorterThan($value, $max)
    {
        if (strlen($value) <= $max) {
            return true;
        }
        return false;
    }

    public static function asEmail($value)
    {
        if (filter_var($value, FILTER_VALIDATE_EMAIL)) {
            return true;
        }
        return false;
    }

    public static function asPhoneNumber($value)
    {
        if (preg_match("/^\(?[0-9]{3}\)? *-? *[0-9]{3} *-? *[0-9]{4}$/", $value)) {
            return true;
        }
        return false;
    }

    private static function testRule($rule)
    {

        if (isset(self::$errors[$rule->field_name])) {
            return;
        }

        if (isset(self::$fields[$rule->field_name])) {
            $value = self::$fields[$rule->field_name];
        }
        else {
            $value = null;
        }

        switch ($rule->type_of_rule) {
            case 'required' :
                if (empty($value)) {
                    self::$errors[$rule->field_name] = $rule->message;
                    return;
                }
                break;
            case 'minlength' :
                if (!(self::longerThan($value, $rule->param))) {
                    self::$errors[$rule->field_name] = $rule->message;
                    return;
                }
                break;
            case 'maxlength' :
                if (!(self::shorterThan($value, $rule->param))) {
                    self::$errors[$rule->field_name] = $rule->message;
                    return;
                }
                break;
            case 'email' :
                if (!(self::asEmail($value))) {
                    self::$errors[$rule->field_name] = $rule->message;
                    return;
                }
                break;
            case 'phonenumber' :
                if (!(self::asPhoneNumber($value))) {
                    self::$errors[$rule->field_name] = $rule->message;
                    return;
                }
                break;
        }
    }

}


В контролере прописивается всё следующим образом:
public function indexAction()
    {
        if (isset($_POST['submit'])){

            $name = $_POST['name'];

            Validator::addRule(
                'name',
                'Поле name обязательное',
                'required');
            Validator::addRule(
                'name',
                'Имя должно состоять не менне чем из 2-х символов',
                'minlength',
                3);

            Validator::addEntries($_POST);
            Validator::validate();

            $errors = Validator::getErrors();

        }
    }
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ответы на вопрос 2
Black_Tafita
@Black_Tafita
Full-Stack Developer
Для получения данных из базы ты должен использовать модель, в данном случае это модель Юзера.
Дальше ты просто подключаешь свою модель в любой нужный тебе класс и забираешь из базы методами модели то что тебе нужно
Ответ написан
@Yan-s
Существует полно адекватных компонентов валидации, посмотрите симфони, например. Зачем тащить какой то мутный код. То же самое, кстати насчет "Пишу свой велосипед т.е. OOP, MVC фреймворк". Пишут фреймворки не так, используйте готовые компоненты по максимуму.

Я же не могу в этом классе писать запросы в БД на проверку существования почты или логина, или пароля.

Ага, не можете, для этого у вас есть модель. Вы должны обратиться к соответствующему методу модели из вашего валидатора.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы