iljaaa /
Requires
- php: >=7.4.0
- ext-mbstring: *
Requires (Dev)
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-25 20:31:22 UTC
README
另一个PHP验证库
为PHP 7.4编写。未在版本8上测试,但应该没有问题
! Machete不对您的数据进行任何预过滤器修改。
请不要在没有预先清理数据的情况下使用它,如$_GET、$_POST等...
Machete不与$_FILES数据一起工作。
内容
完整示例
class YourFromValidationClass extends Validation { public string $name = ""; public function rules (): array { return [ [['name', 'dateOfBirth'], 'required'], ['name', 'string', 'max' => 100], ['dateOfBirth', 'date'], ]; } } $form = new YourFromValidationClass(); $form->load([ 'name' => 'Vlad Țepeș III', 'dateOfBirth' => '1430-05-01' ]); if ($form->validate()){ // data is valid } else { $errors = $form->getErrors() }
安装
通过composer
composer require iljaaa/machete
或下载它,在autoload中定义iljaaa/machete命名空间并使用
如何使用表单验证
在验证之后,使用isValid方法获取验证结果而不检查数据,这更快,因为验证结果保存在状态中。
在您调用validate方法之前,isValid将始终返回false。
要检查:表单中的数据之前是否已检查?(是否调用了validate方法)使用isVasValidated
表单验证类
要创建自己的验证表单类,只需扩展\Iljaaa\Machete\Validation
这是一个抽象类,并且它只有一个抽象方法rules()
返回规则数组
public function rules(): array;
示例
class FormValidation extends \Iljaaa\Machete\Validation { public function rules(): array { return [ ['attribute', 'rule', ... additional options], ]; } }
在表单中加载数据
要加载数据到验证类,请使用方法load
public function load(array $data): void;
数据将保存在内部存储中。
设置单个项目值
public function setValue (string $name, $value): void
或使用魔法(它将在基础中调用setValue)
$form->yourDataKey = $value;
从表单获取数据
要从内部存储获取数据,请使用
public function getData(): array;
从数据中获取一个项目
public function getValue (string $name): mixed
或使用魔法(它将在基础中调用getValue)
$it = $form->yourDataKey;
您可以为子验证类的受保护和公共属性进行验证。
如果在子类中定义了命名属性并使用任何加载数据的方法,值将不会放入内部存储,而是保存到您的属性中
示例
class FormValidation extends \Iljaaa\Machete\Validation { public string $name = ''; public function rules(): array { return [ ['name', 'string'], ['number', 'int'], ]; } } $form = new FormValidation(); $forn->load([ 'name' => 'Ilja', // this value will be written to $form->name 'number' => 1 // this to internal storage ]);
规则方法
规则方法必须返回一个规则数组。每个规则都是一个描述一个验证规则的数组。它必须使用相同的语法
public function rules(): array { return [ ['attribute', 'validator'], ['name', 'required'], ['phone', 'string', 'max' => 100], ]; }
钻到规则行
规则数组看起来像这样
['attribute_name', 'rule', ... additonal parameters],
数组的第一元素是验证的表单属性名称。如果您需要检查多个属性,可以使用名称数组
[['attribute_name', 'second_attribute'], 'rule', ... additonal parameters],
第二个是规则名称,您可以使用提供的规则(如:string、int、in ...)或创建自验证方法
接下来是每个规则的不同选项
获取验证错误消息
/** * Array of errors grouped by attribute */ public function getErrors(): array
/** * First error found */ public function getFirstError(): string
/** * Array of errors for attribute */ public function getErrorsForAttribute(string $attribute): array
/** * First error found for attribute */ public function getFirstErrorForAttribute(string $attribute): string
将规则作为独立项使用
大多数规则可以在没有表单的情况下使用。可以创建验证规则实例,对其进行参数化并将数据传递给验证方法。
提供规则的章节包含每个规则的示例。
提供规则
规则短名必须在规则数组的第二位置中描述
必需
必需规则使用empty()函数来检查值。对零要小心。
['attribute', 'required', ....]
规则附加参数
此规则没有附加参数。
重写错误信息
当您重写默认错误信息时,您可以使用命名变量来替换错误信息中的值。
替换的值
信息
- :attribute - 来自属性名称
独立使用
告诉我使用此规则独立使用的任何理由?使用empty()函数
字符串
字符串规则使用ms_strlen函数来计算字符串长度。
在其它检查之前,值将使用is_string函数进行检查。
如果它返回一个错误结果,规则的其他检查将不会运行
['attribute', 'string', ...]
规则附加参数
重写错误信息
替换的值
错误类型
- :attribute - 来自属性名称
转换为短整型
- :attribute - 来自属性名称
- :min - 要检查的最小长度
转换为长整型
- :attribute - 来自属性名称
- :max - 要检查的最大长度
独立使用
$result = (new StringRule()) ->setMin(int $min) ->setMax(int $max) ->setWrongType(string $wrongType) ->setToShort(string $toShort); ->setToLong(string $toLong); ->validate($value, ?string $attribute = null, ?Validation $validation = null);
整数和浮点数
如果您使用float验证器并将int值传递给验证函数,它将自动转换为float。
对于所有其他类型,您将得到错误类型错误和错误的验证结果。
['attribute', 'float', ....] ['attribute', 'int', ....]
附加参数
重写错误信息
替换的值
错误类型
- :attribute - 表单属性名称
转换为小值
- :attribute - 表单属性名称
- :min - 要检查的最小值
转换为大值
- :attribute - 表单属性名称
- :max - 要检查的最大值
独立使用
$result = (new IntRule()) ->setMin (float $min) ->setMax(float $max) ->setWrongType(string $message) ->setToSmall(string $message); ->setToBig(string $message); ->validate($value, ?string $attribute = null, ?Validation $validation = null);
日期和日期时间
用于检查表单日期和日期时间字段值或\DateTime对象
与不同日期格式相同的验证器
- 日期:Y-m-d
- 日期时间:Y-m-d H:i
['attribute', 'date', ....] ['attribute', 'datetime', ....]
附加参数
重写错误信息
替换的值
错误类型
- :attribute - 来自属性名称
错误格式
- :attribute - 来自属性名称
- :format - 当前格式
在最小值之前
- :attribute - 表单属性名称
- :min - 当前格式中的最小日期
在最大值之后
- :attribute - 表单属性名称
- :max - 当前格式中的最大日期
独立使用
$result = (new DateTimeRule()) ->setFormat (string $format) ->setMin (\DateTime $min) ->setMinAsString (string $min, ?string $format = null) ->setMax (\DateTime $max) ->setMaxAsString (string $max, ?string $format = null) ->setWrongType (string $wrongType) ->setWrongFormat (string $wrongFormat) ->setBeforeMin (string $beforeMin) ->setAfterMax (string $afterMax) ->validate($value, ?string $attribute = null, ?Validation $validation = null);
在...
在规则中使用基础中的in_array函数
['age', 'in', array $haystack, ...]
第三个参数必须是堆栈数组(或实现Traversable接口的对象,需要更多测试)。如果它不正确,您将得到错误参数异常。
附加参数
重写错误信息
替换的值
信息
- :attribute - 来自属性名称
独立使用
$result = (new InValidationRule()) ->inArray($needle, $haystack, bool $strict = false); or $result = (new InValidationRule($haystack)) ->validate($value, ?string $attribute = null, ?Validation $validation = null); or $result = (new InValidationRule()) ->setHaystack(array $haystack) ->setMessage(string $message) ->setStrict(bool $strict) ->validate($value, ?string $attribute = null, ?Validation $validation = null);
正则表达式
正则表达式规则使用基础中的filter_var函数
filter_var($value, FILTER_VALIDATE_REGEXP, ["options" => ["regexp" => $regex]]);
['attribute', 'regex', string $pattern, ...]
第三个参数必须是正则表达式模式。
如果您未设置项目或设置错误,您将得到规则配置异常。
附加参数
规则没有附加参数。
重写错误信息
替换的值
信息
- :attribute - 来自属性名称
独立使用
$result = (new RegexValidationRule()) ->isMatch($value, ?string $attribute = null, ?Validation $validation = null); or $result = (new RegexValidationRule(string $pattern)) ->validate($value, ?string $attribute = null, ?Validation $validation = null); or $result = (new RegexValidationRule()) ->setRegex(string $regexPattern) ->setMessage(string $message) ->validate($value, ?string $attribute = null, ?Validation $validation = null);
自验证函数
您可以在验证表中使用可调用对象,只需将其传递到规则数组的位置二即可
验证将检查对象的返回值,如果它返回false,验证将更改表单状态为false。
如果您的函数不返回布尔值,您将得到验证异常。
创建自我验证函数的一些示例
['attributeName', function () {}] ['attributeName', fn ($value, string $attribute, Rule $rule) => true] ['attributeName', [$this, 'publicOrProtectedMethod']] ['attributeName', [YoureClass::class, 'publicStaticMethod']]
在调用对象之前,它将通过is_callable函数进行检查
如果is_callable函数返回错误结果,您将得到所有验证的错误结果和错误类型错误。
重写错误信息
在验证中,您的函数将使用以下参数调用
function yourValidationFunction($value, string $attribute, CallableRule $rule): bool
位置
- $value - 要检查的值
- 字符串 $attribute - 表单属性名称
- CallableRule $rule - CallableRule类的实例,它是用户可调用函数的包装器
使用规则对象从可调用函数添加错误信息
function yourValidationFunction($value, string $attribute, CallableRule $rule): bool { $rule->addError('test error'); return false; }
独立使用可调用规则
(new CallableRule(fn ($value, string $attribute, CallableRule $r) => true)) ->validate($value); (new CallableRule() ->setCallable(fn ($value, string $attribute, CallableRule $r) => true) ->setAttributeName('testAttribute') ->setWrongType('wrong callable object type') ->validate($yourValue);
自定规则
要创建自己的验证规则,您需要创建类并实现\Iljaaa\Machete\rules\UserRule接口。
然后您可以使用规则如下所示使用验证器
['attributeName', 'rule', YourRuleClass::class]
规则接口只有一个方法
public function validate ($value, string $attribute, UserRuleWrapper $userRuleWrapper, Validation $validation): bool;
位置
- $value - 您要检查的值
- 字符串 $attribute - 表单属性名称
- UserRuleWrapper $userRuleWrapper - 这是特殊接口的实例,用于包装所有用户规则
- Validation $validation - 验证表单实例
如果您的值无效,将字符串错误添加到包装器对象中,它还设置验证结果为false
$userRuleWrapper->addError('test error');
规则类的示例
class YourRuleClass implements \Iljaaa\Machete\rules\UserRule { /** * @var array $config your rule config row */ public function __construct (array $config) { } public function validate ($value, string $attribute, UserRuleWrapper $userRuleWrapper, Validation $validation): bool { if (empty($value)) { $userRuleWrapper->addError('test error'); return false; } return true; } }
在验证中使用您的类
class FormValidation extends \Iljaaa\Machete\Validation { public string $myAttribute = 'test'; public function rules(): array { return [ ['myAttribute', 'rule', YourRuleClass::class] ]; } }
在视图中使用表单状态
如果您想知道(是否已验证表单)验证表单的形式以及验证的结果,您可以这样做
if ($form->isVasValidate() && $form->isValid() == false) echo "Form is not valid"
如果您想知道(是否已加载和验证表单)表单是否已加载和验证,并且属性是否有错误显示它,您可以这样做
if ($form->isVasValidate() && $form->isAttributeValid('attribute') == false) { echo $form->getFirstErrorForAttribute("attribute") }
验证器状态公共方法
/** * Is was validate method call */ public function isVasValidated(): bool
回答关于表单是否已验证过的问题
/** * Is data valid */ public function isValid(): bool
/** * Is attribute valid */ public function isAttributeValid (string $attribute): bool
在调用 validate() 方法之前,isValid() 和 isAttributeValid() 方法始终返回 false
待办事项
- 字符串长度
- 在规则中使用 \Traversable 进行测试
- id?无符号整数
- 数组
- 关联数组
- 由数组构成的数组
- 在自定义规则中添加额外的选项
- 考虑将 int 和 float 分成不同的验证器,看看它是否适用于不同类型
- 考虑在验证器中为字段验证状态添加静态缓存以加快速度
- isVasValidated -> isItValidated