star / 规格
规格系统,允许将规格应用于数据源。
0.2.0
2024-01-11 19:01 UTC
Requires
- php: ^7.0|^8.0
- ext-mbstring: *
- beberlei/assert: ^3.3
- star/php-type: ^2.0
Requires (Dev)
- doctrine/dbal: ^3.3
- phpstan/phpstan: ^1.0
- phpstan/phpstan-phpunit: ^1.3
- phpunit/phpunit: ^10.0
- squizlabs/php_codesniffer: ^3.6
README
php的规格系统。提供了一些库的适配器。
安装
使用Composer: composer require star/php-specification
使用方法
使用基本的php数组
fetchAll()
获取所有匹配规格的项目
$data = [ [ 'id' => 1, 'name' => 'Joe', 'active' => false, ], [ 'id' => 2, 'name' => 'Jane', 'active' => true, ], [ 'id' => 3, 'name' => 'Jack', 'active' => true, ], ]; $result = ArrayResult::fromRowsOfMixed(...$data); $items = $result->fetchAll(EqualsTo::fromBoolean('alias', 'active', true)); echo $items->count(); // 2 echo $items->getValue(0, 'name')->toInteger(); // Jane echo $items->getValue(1, 'name')->toInteger(); // Jack
fetchOne()
获取单个匹配规格的项目
注意:如果规格结果超过一行,将抛出NotUniqueResult异常。
$data = [ [ 'id' => 1, 'name' => 'Joe', 'active' => false, ], [ 'id' => 2, 'name' => 'Jane', 'active' => true, ], [ 'id' => 3, 'name' => 'Jack', 'active' => true, ], ]; $result = ArrayResult::fromRowsOfMixed(...$data); $row = $result->fetchOne(EqualsTo::booleanValue('alias', 'active', false)); echo $row->count(); // 1 echo $row->getValue('name')->toInteger(); // Joe
exists()
获取是否有一个项目匹配规格
$data = [ [ 'id' => 1, 'name' => 'Joe', 'active' => false, ], [ 'id' => 2, 'name' => 'Jane', 'active' => true, ], [ 'id' => 3, 'name' => 'Jack', 'active' => true, ], ]; $result = ArrayResult::fromRowsOfMixed(...$data); echo $result->exists(EqualsTo::stringValue('alias', 'name', 'Joe')); // true echo $result->exists(EqualsTo::stringValue('alias', 'name', 'Not found')); // false
支持的规格
EqualsTo
属性的值是否与提供的值完全匹配(===
)。
示例
EqualsTo::stringValue('alias', 'name', 'Joe');
注意:两个值都将转换为字符串以断言相等。
Between
属性的数值或日期值是否在左右值之间。
示例
Between::integers('alias', 'age', 18, 40); Between::dates('alias', 'published_at', new \DateTime('1900-01-01'), new \DateTime('2000-01-01 12:34:56'));
注意:格式Y-m-d H:i:s
是唯一支持的用于比较的格式。
Contains
提供的值是否在项目的属性(开始、结束、中间)的任何位置找到。
示例
Contains::string('alias', 'name', 'Joe');
EndsWith
提供的值是否在项目的属性的末尾找到。
示例
EndsWith::string('alias', 'name', 'Joe');
Greater
属性的数值或日期值是否大于提供的值。
示例
Greater::thanInteger('alias', 'age', 18); Greater::thanDate('alias', 'born_at', new \DateTime('2000-01-01'));
GreaterEquals
属性的数值或日期值是否大于或等于提供的值。
示例
GreaterEquals::thanInteger('alias', 'age', 18); GreaterEquals::thanDate('alias', 'born_at', new \DateTime('2000-01-01'));
InArray
属性的值是否包含在提供的值范围内。
示例
InArray::ofIntegers('alias', 'age', 18, 20, 34); // would return items with age 18, 20 or 34.
IsEmpty
属性的值是否为空值。
示例
new IsEmpty('alias', 'name');
注意:零、布尔false被视为空。
IsNot
反转提供的规格。
示例
new IsNot(Lower::thanInteger('alias', 'age', 18)); // would return items with age >= 19.
IsNull
属性的值是否为null值。
示例
new IsNull('alias', 'age');
注意:零、布尔false和空字符串不被视为null。
Lower
属性的数值或日期值是否小于提供的值。
示例
Lower::thanInteger('alias', 'age', 18); Lower::thanDate('alias', 'age', new \DateTime('2000-01-01'));
LowerEquals
属性的数值或日期值是否小于或等于提供的值。
示例
LowerEquals::thanInteger('alias', 'age', 18); LowerEquals::thanDate('alias', 'age', new \DateTime('2000-01-01'));
StartsWith
提供的值是否在项目的属性的开始位置找到。
示例
StartsWith::string('alias', 'name', 'Joe');
组合(And / Or)
示例
// equivalent to "name = 'Joe' AND active = true" new AndX( EqualsTo::stringValue('alias', 'name', 'Joe'), EqualsTo::booleanValue('alias', 'active', true), ); // equivalent to "name = 'Joe' OR active = true" new OrX( EqualsTo::stringValue('alias', 'name', 'Joe'), EqualsTo::booleanValue('alias', 'active', true), );
按属性排序
我们还可以使用1个或多个属性对规格进行排序。
示例
new AndX( OrderBy::desc('alias', 'is_active'), OrderBy::asc('alias', 'age'), OrderBy::desc('alias', 'name'), ); new OrX( OrderBy::desc('alias', 'is_active'), OrderBy::asc('alias', 'age'), OrderBy::desc('alias', 'name'), );
支持的框架
- PHP内存数组使用ResultSet实现。
- Doctrine DBAL
- Doctrine ORM (待办事项)