什么能成为一个优秀的PHP验证课程?

时间:2016-04-19 14:58:48

标签: php html

我想了解一下您对创建验证类的最佳方法的看法。 下面我粘贴在我的版本中,它还没有真正广泛,但到目前为止它是正确的方法吗?

我希望每个元素都可以出现在一个表单中,并且应该根据字符串的字符串长度或一般的图像或文件的文件大小来验证哪些元素具有自己的属性(见下文)。

另外,最好将这些规则声明为嵌套数组,还是应该将它们放在一个大字符串中,然后在此过程中将其拆分?     

mb_internal_encoding("UTF-8");

class Phrase {
    //creates parts of sentences, not important
    static function additive(array $limbs) {
        return implode(' and ', array_filter([implode(', ', array_slice($limbs, 0, -1)), end($limbs)], 'strlen'));
    }
}

class Text {
    static function validate($item) {
        $err = array();
        $value = $_POST[$item] ?? $_GET[$item];
        $criteria = FormProcess::$criteria[$item];
        foreach($criteria as $critKey => $critVal) {
            if($critKey === 'required' && empty($value)) {
                $err[] = "is required";
            } else if(!empty($value)) {
                switch($critKey) {
                    case 'length':
                        if(is_array($critVal)) {
                            //min and max set
                            if(mb_strlen($value) < $critVal[0] || mb_strlen($value) > $critVal[1]) {
                                $this->err[] = "must contain between {$critVal[0]} and {$critVal[1]} characters"; 
                            }
                        } else {
                            //max set only
                            if(mb_strlen($value) > $critVal) {
                                $err[] = "must contain a maximum of $critVal characters";
                            }
                        }
                    break;
                    case 'pattern':
                        if(!preg_match($critVal[0], $value)) {
                            $err[] = "may consist of {$critVal[1]} only";
                        }
                    break;
                    case 'function':
                        $result = static::$critVal($value);
                        if($result) {
                            $err[] = $result;
                        }
                    break;
                }
            }
        }
        if(!empty($err)) {
            return "{$criteria['name']} " . Phrase::additive($err) . "!";
        }
        return false;
    }

    private static function email($email) {
        //checks if given string is a valid email address
        if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            return "is invalid";
        }
        return false;
    }
}

class File {
    //checks for aspects like filesize...
    static function validate() {
        //...
    }   
}

class Image extends File {
    static function validate() {
        parent::validate(); //perform general file checks first
        //...checks for images specifically
    }
}

class Video extends File {
    static function validate() {
        parent::validate(); //perform general file checks first
        //...checks for videos specifically
    }
}

class FormProcess {
    public $errors;

    //declare, what kind of requirements the items must meet
    static $criteria = array(
        'email' => array(
            'type'     => 'Text',
            'required' => true,
            'name'     => 'Email',
            'length'   => 48,
            'function' => 'email', 
        ),

        'username' => array(
            'type'     => 'Text',
            'required' => true,
            'name'     => 'Username',
            'length'   => [4, 24],
            'pattern'  => ['/^[-\w]+$/', "alphanumeric characters, underscores and hyphens"],
        ),

        'password' => array(
            'type'     => 'Text',
            'required' => true,
            'name'     => 'Password',
            'length'   => [6, 100],
            'pattern'  => ['/^[\S]+$/', "non-whitespace characters"],
        ),
    );

    //runs the validate function on each item while storing occuring errors
    function __construct(array $items) {
        foreach($items as $item) {
            $class = self::$criteria[$item]['type'];
            $result = $class::validate($item);
            if($result) {
                $this->errors[] = $result;
            }
        }
    }
}

然后你所要做的就是在一个数组中命名所有预期的项目(通过它们的html&#39;名称和表格中的属性)并将其传递给构造函数,然后构造函数将运行相应的验证每个项目的功能。

$expected = ['username', 'password'];
$signup = new FormProcess($expected);

if($signup->errors) { 
    ?>
    There was something wrong with your request:
    <ul>
        <?php foreach($signup->errors as $error) { ?>
            <li><?= $error ?></li>
        <?php } ?>
    </ul>
    <?php
}

我希望从错误中吸取教训,并在需要的地方对您的代码进行改进。 提前谢谢!

0 个答案:

没有答案