什么是一个好的PHP验证类?
我想了解您对创建验证类的最佳方法的看法。 下面我粘贴了我的版本,它还不是很广泛,但到目前为止它是正确的方法吗 我希望每个元素都可以以一种形式出现,并且应该验证它们有自己的属性,比如字符串的字符串长度或者图像或文件的文件大小(见下文) 另外,将这些规则声明为嵌套数组更好吗?还是将它们放在一个大字符串中,然后在过程中拆分?什么是一个好的PHP验证类?,php,html,Php,Html,我想了解您对创建验证类的最佳方法的看法。 下面我粘贴了我的版本,它还不是很广泛,但到目前为止它是正确的方法吗 我希望每个元素都可以以一种形式出现,并且应该验证它们有自己的属性,比如字符串的字符串长度或者图像或文件的文件大小(见下文) 另外,将这些规则声明为嵌套数组更好吗?还是将它们放在一个大字符串中,然后在过程中拆分? mb_internal_encoding("UTF-8"); class Phrase { //creates parts of sentences, not impo
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;
}
}
}
}
mb_内部编码(“UTF-8”);
类短语{
//创造句子的一部分,不重要
静态函数加法器(数组$frameds){
返回内爆('and',array_filter([introde(',','array_slice($fracts,0,-1)),end($fracts)],'strlen');
}
}
课文{
静态函数验证($item){
$err=array();
$value=$\发布[$item]??$\获取[$item];
$criteria=FormProcess::$criteria[$item];
foreach($critKey=>$critVal的标准){
如果($critKey=='required'&&empty($value)){
$err[]=“是必需的”;
}如果(!空($value)){
开关($critKey){
案例“长度”:
if(is_数组($critVal)){
//最小和最大集
如果(mb_strlen($value)<$critVal[0]| | mb_strlen($value)>$critVal[1]){
$this->err[]=“必须包含介于{$critVal[0]}和{$critVal[1]}个字符之间的字符”;
}
}否则{
//仅限最大值集
如果(mb_strlen($value)>$critVal){
$err[]=“最多必须包含$critVal字符”;
}
}
打破
案例“模式”:
如果(!preg_匹配($critVal[0],$value)){
$err[]=“只能由{$critVal[1]}组成”;
}
打破
案例“功能”:
$result=static::$critVal($value);
如果($结果){
$err[]=$result;
}
打破
}
}
}
如果(!empty($err)){
返回“{$criteria['name']}”。短语::加法($err)。“!”;
}
返回false;
}
专用静态功能电子邮件($email){
//检查给定字符串是否为有效的电子邮件地址
如果(!filter_var($email,filter_VALIDATE_email)){
返回“无效”;
}
返回false;
}
}
类文件{
//检查文件大小等方面。。。
静态函数validate(){
//...
}
}
类图像扩展文件{
静态函数validate(){
parent::validate();//首先执行常规文件检查
//…专门检查图像
}
}
类视频扩展文件{
静态函数validate(){
parent::validate();//首先执行常规文件检查
//…专门检查视频
}
}
类窗体进程{
公共错误;
//声明,项目必须满足什么样的要求
静态$criteria=array(
'电子邮件'=>数组(
'类型'=>'文本',
“必需”=>true,
“名称”=>“电子邮件”,
“长度”=>48,
'功能'=>'电子邮件',
),
“用户名”=>数组(
'类型'=>'文本',
“必需”=>true,
“名称”=>“用户名”,
“长度”=>[4,24],
'模式'=>['/^[-\w]+$/',“字母数字字符、下划线和连字符”],
),
“密码”=>数组(
'类型'=>'文本',
“必需”=>true,
“名称”=>“密码”,
“长度”=>[6100],
'模式'=>['/^[\S]+$/',“非空白字符”],
),
);
//在存储发生的错误时,对每个项目运行验证函数
函数构造(数组$items){
foreach($items作为$item){
$class=self::$criteria[$item]['type'];
$result=$class::validate($item);
如果($结果){
$this->errors[]=$result;
}
}
}
}
然后,您所要做的就是在一个数组中命名所有预期项(通过表单中的html“name”属性),并将其传递给构造函数,然后构造函数将对每个项运行相应的验证函数
$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
}
$expected=['username','password'];
$signup=新的FormProcess(预期值);
如果($signup->errors){
?>
您的请求有问题:
许多好的问题都会根据专家经验产生一定程度的意见,但对这个问题的回答往往几乎完全基于意见,而不是事实、参考资料或特定的专业知识。你可能想找一个发展论坛(也许?)然后,当/如果你有具体的编码问题,回到StackOverflow,我们会很乐意提供帮助。如果你使用json字符串作为规则,你不需要自己序列化/反序列化,因为你可以依赖json_编码和json_解码。这也很容易手工编辑。谢谢你的回复,它们都是非常有帮助。我期待着询问quora并修复阵列。@nooby_web_developer-不客气。CodeProject是另一个适合进行扩展讨论的地方。:)许多好的问题都会根据专家经验产生一定程度的意见,但这个问题的答案几乎完全基于opini说明,而不是事实、参考资料或具体的