iljaaa /

此包的最新版本(dev-main)没有可用的许可信息。

dev-main 2023-01-25 17:01 UTC

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命名空间并使用

如何使用表单验证

  1. 创建表单类并扩展它以使用Validate类(更多信息
  2. 重写规则方法
  3. 在您的类中加载数据
  4. 调用validate()方法。它返回验证的布尔结果

在验证之后,使用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