phputil/validator 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

phputil/validator

Composer 安装命令:

composer require --dev phputil/validator

包简介

Easy and powerful validator for PHP

README 文档

README

Easy and powerful validation library for PHP.

Build Status

We use semantic versioning. See our releases.

Installation

composer require phputil/validator

Dependends only on phputil/rtti.

An Example

A step-by-step example for demonstrating its use.

// Suppose that your application receives an object in a JSON like this:
$json = <<<EXAMPLE
{
	"name": "Bob Developer",
	"likes": 150,
	"phone": { "number": "99988-7766", "notes": "WhatsApp, Telegram" },
	"friends": [ "Suzan", "Mike", "Jane" ]
}
EXAMPLE;
// So you transform the JSON into an object
$obj = json_decode( $json );
// Now you want to validate this object, and you create a Validator
$validator = new Validator();
// And define the rules
$rules = array(
	// name must have from 2 to 60 characters
	'name' => array( Rule::LENGTH_RANGE => array( 2, 60 ), Option::LABEL => 'Name' ),
	// likes must be greater or equal to zero
	'likes' => array( Rule::MIN_VAUE => 0 ),
	// for the phone...
	'phone' => array( Rule::WITH => array(
		// number must follow a regex
		'number' => array(
			Rule::REGEX => '/^[0-9]{5}\\-[0-9]{4}$/',
			Option::LABEL => 'Phone Number'
			)
	) ),
	// have a friend limit
	'friends' => array( Rule::MAX_COUNT => 100 )
);
// And define the messages (we also could load it from a JSON file)
$messages = array(
	'en' => array( // "en" means "english" locale. This is the default locale.
		Rule::LENGTH_RANGE => '{label} must have from {min_length} to {max_length} characters.',
		Rule::MIN_VAUE => '{label} must be greater than or equal to {min_value}.',
		Rule::REGEX => '{label} has an invalid format.',
		Rule::MAX_COUNT => '{label} must have up to {max_count} item(s).',
	)
);
$validator->setMessages( $messages );

// Now we will check the object using our rules
$problems = $validator->checkObject( $obj, $rules );
// In this moment, problems will be an empty array because all values passed.
// That is: $problems === array()

// However, lets make our rules harder, just to understand how the validation works
$rules[ 'name' ][ Rule::LENGTH_RANGE ] = array( 2, 5 ); // Max of 5
$rule[ 'friends' ][ Rule::MAX_COUNT ] = 1; // just one friend (the best one :-)

// And check again
$problems = $validator->checkObject( $obj, $rules );
// Now $problems is an array like this:
// array(
//	'name' => array( 'length_range' => 'Name must have from 2 to 5 characters.' ),
//	'friends' => array( 'max_count' => 'friends must have up to 1 item(s)' )
// )
// Which means that we have two fields with problems. The format is:
//  field => hurt rule => message
// For example, the field "name" hurt the "length_range" rule and its message is
// "Name must have from 2 to 5 characters.".
//
// If we need to know whether "name" has a problem, we just check with isset:
if ( isset( $problems[ 'name' ] ) ) {
	echo 'Name has a problem', PHP_EOL;
}
// If we are only interested in the messages, and don't care about the fields,
// we just use the ProblemsTransformer
$messages = ( new ProblemsTransformer() )->justTheMessages( $problems );
var_dump( $messages );
// Will print something like:
// array( 'Name must have from 2 to 5 characters.', 'friends must have up to 1 item(s)' )
//
// That's it for now. Enjoy it!

Features

  • Validates basic types (see example 1)
  • Validates arrays (see example 2)
  • Validates dynamic objects (stdClass) (see example 3)
  • Validates objects (of user-created classes) with private or protected attributes (see example 3)
  • Supports localized validation messages (different locales)
  • Supports different string formats (UTF, ISO-8859-1, ASCII, etc.)

Available Rules

  • required
  • min_length
  • max_length
  • length_range
  • min_value
  • max_value
  • value_range
  • min_count (for arrays)
  • max_count (for arrays)
  • count_range (for arrays)
  • in (for arrays)
  • not_in (for arrays)
  • start_with (accepts a string or an array of strings, compared with "or")
  • not_start_with (accepts a string or an array of strings, compared with "or")
  • end_with (accepts a string or an array of strings, compared with "or")
  • not_end_with (accepts a string or an array of strings, compared with "or")
  • contains (accepts a string or an array of strings, compared with "or")
  • not_contains (accepts a string or an array of strings, compared with "or")
  • regex
  • format: allows to use a format (see Available Formats)
  • with: allows to define rules for sub-arrays or sub-objects.
  • custom: you can add others easily. See below.

Adding a custom rule

// Adding a custom rule called "myRule" in which the value should be zero:
$validator->setRule( 'myRule', function( $value ) { return 0 == $value; } );

Now checking the custom rule:

$value = rand( 0, 5 ); // Value to be checked, a random between 0 and 5 (inclusive)
$rules = array( 'myRule' => true ); // Rules to be checked. In this example, just "myRule".
$problems = $validator->check( $value, $rules ); // check() will return the hurt rules
echo isset( $problems[ 'myRule' ] ) ? 'myRule as hurt' : 'passed';

Available Formats

  • anything
  • string (same as anything)
  • name
  • word
  • alphanumeric
  • alpha
  • ascii
  • numeric
  • integer
  • double
  • float (same as double)
  • monetary
  • price (same as monetary)
  • tax
  • date (equals to date_dmy)
  • date_dmy
  • date_mdy
  • date_ymd
  • time
  • longtime
  • datetime (equals to datetime_dmy)
  • datetime_dmy
  • datetime_mdy
  • datetime_ymd
  • longdatetime (equals to longdatetime_dmy)
  • longdatetime_dmy
  • longdatetime_mdy
  • longdatetime_ymd
  • email
  • http
  • url
  • ip
  • ipv4
  • ipv6
  • custom: you can add others easily. See below.

You may specify the separator for date-based formats. Default is "/", for example "31/12/1999".

Adding a custom format

// Adding a format "myFormat" in which the value should start with "https://"
$validator->setFormat( 'myFormat', function( $value ) {
	return mb_strpos( $value, 'https://' ) === 0;
	} );

Now checking the format:

$value = 'http://non-https-site.com';
$rules = array( Rule::FORMAT => 'myFormat' ); // rules to be checked
$problems = $validator->check( $value, $rules ); // check() returns the hurt rules
echo isset( $problems[ Rule::FORMAT ] ) ? 'myFormat as hurt' : 'passed';

Message Replacements

  • {min_length} shows the minimum length;
  • {max_length} shows the maximum length;
  • {length_range} shows the minimum and the maximum length (e.g. "5-10");
  • {min_value} shows the minimum value;
  • {max_value} shows the maximum value;
  • {value_range} shows minimum and maximum values (e.g. "5-10");
  • {min_count} shows the minimum count;
  • {max_count} shows the maximum count;
  • {count_range} shows the minimum count and the maximum count (e.g. "5-10");
  • {in} shows the set of items separated by comma;
  • {not_in} shows the set of items separated by comma;
  • {start_with} shows the string or the set of strings separated by comma;
  • {not_start_with} shows the string or the set of strings separated by comma;
  • {end_with} shows the string or the set of strings separated by comma;
  • {not_end_with} shows the string or the set of strings separated by comma;
  • {contains} shows the string or the set of strings separated by comma;
  • {not_contains} shows the string or the set of strings separated by comma;
  • {regex} shows the defined regex;
  • {label} shows the defined label, if defined. Otherwise, shows the array key or object attribute name;
  • {value} shows the value.

Notes:

  • {min_value} and {max_value} are available when the {value_range} is used;
  • {min_length} and {max_length} are available when the {length_range} is used;
  • {min_count} and {max_count} are available when the {count_range} is used.

More

  • Supports UTF-8 and other common formats (ISO-8859-1, Windows-1251, ASCII, etc.)
  • Error messages and formats can be specified by locale.
  • Error messages and formats can be specified at once. This allows you, for example, read them from a JSON file.
  • Formats and rules can be specified without having to extend any class.
  • Classes use a fluent interface (that is, you type less).
  • Builder classes available (soon)

Tests

See here.

Examples

See all

ex1.php - Validating values

ex2.php - Validating arrays

ex3.php - Validating objects

phputil/validator 适用场景与选型建议

phputil/validator 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 512 次下载、GitHub Stars 达 4, 最近一次更新时间为 2015 年 10 月 23 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「testing」 「validator」 「validation」 「check」 「input」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 phputil/validator 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 phputil/validator 我们能提供哪些服务?
定制开发 / 二次开发

基于 phputil/validator 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 512
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 4
  • 点击次数: 19
  • 依赖项目数: 0
  • 推荐数: 1

GitHub 信息

  • Stars: 4
  • Watchers: 2
  • Forks: 1
  • 开发语言: PHP

其他信息

  • 授权协议: LGPL-3
  • 更新时间: 2015-10-23