lolltec / limoncello-php-component-validation

dev-master 2021-01-25 12:01 UTC

This package is auto-updated.

Last update: 2024-09-25 20:00:26 UTC


README

Scrutinizer Code Quality Code Coverage Build Status License

这个验证库速度快,易于使用,功能强大且灵活。与许多其他库不同,它不会尝试为所有可能的场景提供“验证规则”,因为这些实现可能不符合您的需求,使用此类库是痛苦的。相反,它提供了一种极简单的方式添加自定义验证规则。

此外,它支持验证规则的缓存,使其非常快速。还支持自定义错误代码和消息。错误消息可以自定义/本地化,并支持 占位符

使用示例

$validator = v::validator([
    'sku'           => r::required(r::sku()),
    'amount'        => r::required(r::amount(5)),
    'delivery_date' => r::nullable(r::deliveryDate()),
    'email'         => r::email(),
    'address1'      => r::required(r::address1()),
    'address2'      => r::address2(),
    'accepted'      => r::required(r::areTermsAccepted()),
]);

$input = [
    'sku'    => '...',
    'amount' => '...',
    ...
];

if ($validator->validate($input)) {
    // use validated/converted/sanitized inputs
    $validated = $validator->getCaptures();
} else {
    // print validation errors
    $errors = $validator->getErrors();
}

完整的示例代码 在此

如您所见,此类自定义规则(如 skuamountdeliveryDateaddress1address2areTermsAccepted)可以与内置的 requirednullable 完美结合。这使得规则在 CREATEUPDATE 操作中可重用,在这些操作中,通常在创建时需要输入,而在更新时可选。

编写这些规则有多容易?许多规则可以从内置的规则中创建(例如 amountaddress1address2areTermsAccepted

equalsnotEqualsinValueslessThanlessOrEqualsmoreThanmoreOrEqualsbetweenstringLengthBetweenstringLengthMinstringLengthMaxregexpnullablestringToBoolstringToDateTimestringToFloatstringToIntstringArrayToIntArrayandXorXifXsuccessfailrequiredenumfilterisArrayisStringisBoolisIntisFloatisNumericisDateTime

class Rules extends \Limoncello\Validation\Rules
{
    public static function sku(): RuleInterface
    {
        return static::stringToInt(new IsSkuRule());
    }

    public static function amount(int $max): RuleInterface
    {
        return static::stringToInt(static::between(1, $max));
    }

    public static function deliveryDate(): RuleInterface
    {
        return static::stringToDateTime(DateTime::ISO8601, new IsDeliveryDateRule());
    }

    public static function email(): RuleInterface
    {
        return static::isString(
            static::filter(FILTER_VALIDATE_EMAIL, null, Errors::IS_EMAIL, static::stringLengthMax(255))
        );
    }

    public static function address1(): RuleInterface
    {
        return static::isString(static::stringLengthBetween(1, 255));
    }

    public static function address2(): RuleInterface
    {
        return static::nullable(static::isString(static::stringLengthMax(255)));
    }

    public static function areTermsAccepted(): RuleInterface
    {
        return static::stringToBool(static::equals(true));
    }
}

如需添加可能需要查询数据库的自定义规则(如 IsSkuRule),则可最小化开销

class IsSkuRule extends ExecuteRule
{
    public static function execute($value, ContextInterface $context): array
    {
        $pdo   = $context->getContainer()->get(PDO::class);
        $isSku = ...;

        return $isSku === true ?
            self::createSuccessReply($value) :
            self::createErrorReply($context, $value, Errors::IS_VALID_SKU);
    }
}

当创建验证器时,开发人员可以传递包含自定义服务的 PSR 容器,并从验证规则中访问该容器。因此,验证可以轻松集成到应用程序逻辑中。

示例应用程序

安装

$ composer require lolltec/limoncello-php-validation

注意:对于消息翻译,需要 PHP-intl。

问题

有关任何相关问题的反馈,请发送到 limoncello

测试

$ composer test