limoncello-php/validation

0.10.0 2020-02-09 14:07 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 limoncello-php/validation

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

问题

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

测试

$ composer test