Skip to content

Commit e35024d

Browse files
committed
some update, add new validator: distinct
1 parent 17ac74b commit e35024d

File tree

4 files changed

+108
-33
lines changed

4 files changed

+108
-33
lines changed

src/Utils/Helper.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,10 @@ public static function getValueOfArray(array $array, $key, $default = null)
275275
return $array[$key];
276276
}
277277

278+
if (!strpos($key, '.')) {
279+
return $default;
280+
}
281+
278282
foreach (explode('.', $key) as $segment) {
279283
if (\is_array($array) && array_key_exists($segment, $array)) {
280284
$array = $array[$segment];

src/Utils/UserAndContextValidatorsTrait.php

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ trait UserAndContextValidatorsTrait
2424
*/
2525
protected static $_validators = [];
2626

27+
/** @var string */
28+
protected static $_fileValidators = '|file|image|mimeTypes|mimes|';
29+
2730
/**
2831
* @see $_FILES
2932
* @var array[]
@@ -74,7 +77,7 @@ public static function setValidator(string $name, callable $callback, string $ms
7477
* @param string $name
7578
* @return null|callable
7679
*/
77-
public static function getValidator($name)
80+
public static function getValidator(string $name)
7881
{
7982
if (isset(self::$_validators[$name])) {
8083
return self::$_validators[$name];
@@ -87,7 +90,7 @@ public static function getValidator($name)
8790
* @param string $name
8891
* @return bool|callable
8992
*/
90-
public static function delValidator($name)
93+
public static function delValidator(string $name)
9194
{
9295
$cb = false;
9396

@@ -135,7 +138,7 @@ public static function getValidators(): array
135138
* @param null|mixed $value
136139
* @return bool
137140
*/
138-
public function required($field, $value = null)
141+
public function required(string $field, $value = null)
139142
{
140143
if (null !== $value) {
141144
$val = $value;
@@ -160,7 +163,7 @@ public function required($field, $value = null)
160163
* @param array|string $values
161164
* @return bool
162165
*/
163-
public function requiredIf($field, $fieldVal, $anotherField, $values)
166+
public function requiredIf(string $field, $fieldVal, $anotherField, $values)
164167
{
165168
if (!isset($this->data[$anotherField])) {
166169
return false;
@@ -184,7 +187,7 @@ public function requiredIf($field, $fieldVal, $anotherField, $values)
184187
* @param array|string $values
185188
* @return bool
186189
*/
187-
public function requiredUnless($field, $fieldVal, $anotherField, $values)
190+
public function requiredUnless(string $field, $fieldVal, $anotherField, $values)
188191
{
189192
if (!isset($this->data[$anotherField])) {
190193
return false;
@@ -205,7 +208,7 @@ public function requiredUnless($field, $fieldVal, $anotherField, $values)
205208
* @param array|string $fields
206209
* @return bool
207210
*/
208-
public function requiredWith($field, $fieldVal, $fields)
211+
public function requiredWith(string $field, $fieldVal, $fields)
209212
{
210213
foreach ((array)$fields as $name) {
211214
if ($this->required($name)) {
@@ -224,7 +227,7 @@ public function requiredWith($field, $fieldVal, $fields)
224227
* @param array|string $fields
225228
* @return bool
226229
*/
227-
public function requiredWithAll($field, $fieldVal, $fields)
230+
public function requiredWithAll(string $field, $fieldVal, $fields)
228231
{
229232
$allHasValue = true;
230233

@@ -246,7 +249,7 @@ public function requiredWithAll($field, $fieldVal, $fields)
246249
* @param array|string $fields
247250
* @return bool
248251
*/
249-
public function requiredWithout($field, $fieldVal, $fields)
252+
public function requiredWithout(string $field, $fieldVal, $fields)
250253
{
251254
$allHasValue = true;
252255

@@ -268,7 +271,7 @@ public function requiredWithout($field, $fieldVal, $fields)
268271
* @param array|string $fields
269272
* @return bool
270273
*/
271-
public function requiredWithoutAll($field, $fieldVal, $fields)
274+
public function requiredWithoutAll(string $field, $fieldVal, $fields)
272275
{
273276
$allNoValue = true;
274277

@@ -288,7 +291,7 @@ public function requiredWithoutAll($field, $fieldVal, $fields)
288291
* @param string|array $suffixes e.g ['jpg', 'jpeg', 'png', 'gif', 'bmp']
289292
* @return bool
290293
*/
291-
public function fileValidator($field, $suffixes = null)
294+
public function fileValidator(string $field, $suffixes = null)
292295
{
293296
if (!$file = $this->uploadedFiles[$field] ?? null) {
294297
return false;
@@ -320,7 +323,7 @@ public function fileValidator($field, $suffixes = null)
320323
* @param string|array $suffixes e.g ['jpg', 'jpeg', 'png', 'gif', 'bmp']
321324
* @return bool
322325
*/
323-
public function imageValidator($field, $suffixes = null)
326+
public function imageValidator(string $field, $suffixes = null)
324327
{
325328
if (!$file = $this->uploadedFiles[$field] ?? null) {
326329
return false;
@@ -367,7 +370,7 @@ public function imageValidator($field, $suffixes = null)
367370
* @param string|array $types
368371
* @return bool
369372
*/
370-
public function mimeTypesValidator($field, $types)
373+
public function mimeTypesValidator(string $field, $types)
371374
{
372375
if (!$file = $this->uploadedFiles[$field] ?? null) {
373376
return false;
@@ -395,7 +398,7 @@ public function mimeTypesValidator($field, $types)
395398
* @param string|array $types
396399
* return bool
397400
*/
398-
public function mimesValidator($field, $types = null)
401+
public function mimesValidator(string $field, $types = null)
399402
{
400403
}
401404

@@ -409,17 +412,17 @@ public function mimesValidator($field, $types = null)
409412
* @param string $compareField
410413
* @return bool
411414
*/
412-
public function compareValidator($val, $compareField)
415+
public function compareValidator($val, string $compareField)
413416
{
414417
return $compareField && ($val === $this->getByPath($compareField));
415418
}
416419

417-
public function sameValidator($val, $compareField)
420+
public function sameValidator($val, string $compareField)
418421
{
419422
return $this->compareValidator($val, $compareField);
420423
}
421424

422-
public function equalValidator($val, $compareField)
425+
public function equalValidator($val, string $compareField)
423426
{
424427
return $this->compareValidator($val, $compareField);
425428
}
@@ -430,7 +433,7 @@ public function equalValidator($val, $compareField)
430433
* @param string $compareField
431434
* @return bool
432435
*/
433-
public function notEqualValidator($val, $compareField)
436+
public function notEqualValidator($val, string $compareField)
434437
{
435438
return $compareField && ($val !== $this->getByPath($compareField));
436439
}
@@ -441,7 +444,7 @@ public function notEqualValidator($val, $compareField)
441444
* @param string $compareField
442445
* @return bool
443446
*/
444-
public function differentValidator($val, $compareField)
447+
public function differentValidator($val, string $compareField)
445448
{
446449
return $compareField && ($val !== $this->getByPath($compareField));
447450
}
@@ -452,7 +455,7 @@ public function differentValidator($val, $compareField)
452455
* @param string $anotherField
453456
* @return bool
454457
*/
455-
public function inFieldValidator($val, $anotherField)
458+
public function inFieldValidator($val, string $anotherField)
456459
{
457460
if ($anotherField && $dict = $this->getByPath($anotherField)) {
458461
return ValidatorList::in($val, $dict);
@@ -461,6 +464,17 @@ public function inFieldValidator($val, $anotherField)
461464
return false;
462465
}
463466

467+
/**
468+
* 验证数组时,指定的字段不能有任何重复值。
469+
* `['foo.*.id', 'distinct']`
470+
* @param mixed $val
471+
* @return bool
472+
*/
473+
public function distinctValidator($val)
474+
{
475+
return ValidatorList::distinct($val);
476+
}
477+
464478
/**
465479
* 比较两个日期字段的 间隔天数 是否符合要求
466480
* @todo
@@ -475,9 +489,27 @@ public function intervalDayValidator($val, $compareField, $expected, $op = '>=')
475489
}
476490

477491
/*******************************************************************************
478-
* getter/setter
492+
* getter/setter/helper
479493
******************************************************************************/
480494

495+
/**
496+
* @param string $name
497+
* @return bool
498+
*/
499+
public static function isCheckFile(string $name)
500+
{
501+
return false !== strpos(self::$_fileValidators, '|' . $name . '|');
502+
}
503+
504+
/**
505+
* @param string $name
506+
* @return bool
507+
*/
508+
public static function isCheckRequired(string $name)
509+
{
510+
return 0 === strpos($name, 'required');
511+
}
512+
481513
/**
482514
* @param string $field
483515
* @return array|null

src/ValidationTrait.php

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,6 @@ public function validate(array $onlyChecked = null, $stopOnError = null)
170170
$cb($this);
171171
}
172172

173-
$data = $this->data;
174-
175173
foreach ($this->collectRules() as $fields => $rule) {
176174
$fields = \is_string($fields) ? Helper::explode($fields) : (array)$fields;
177175
$validator = $rule[0];
@@ -184,7 +182,7 @@ public function validate(array $onlyChecked = null, $stopOnError = null)
184182

185183
// 验证的前置条件 -- 不满足条件,跳过此条规则
186184
$when = $rule['when'] ?? null;
187-
if ($when && ($when instanceof \Closure) && $when($data, $this) !== true) {
185+
if ($when && ($when instanceof \Closure) && $when($this->data, $this) !== true) {
188186
continue;
189187
}
190188

@@ -214,8 +212,8 @@ public function validate(array $onlyChecked = null, $stopOnError = null)
214212
continue;
215213
}
216214

217-
// required* 系列字段检查器
218-
if (\is_string($validator) && 0 === strpos($validator, 'required')) {
215+
// required* 系列字段检查器 || 文件资源检查
216+
if (\is_string($validator) && (self::isCheckRequired($validator) || self::isCheckFile($validator))) {
219217
if (!$this->fieldValidate($field, $value, $validator, $args)) {
220218
$this->addError($field, $this->getMessage($validator, $field, $args, $defMsg));
221219

@@ -239,7 +237,7 @@ public function validate(array $onlyChecked = null, $stopOnError = null)
239237
}
240238

241239
// 字段值验证检查
242-
if (!$this->valueValidate($data, $field, $value, $validator, $args)) {
240+
if (!$this->valueValidate($field, $value, $validator, $args)) {
243241
$this->addError($field, $this->getMessage($validator, $field, $args, $defMsg));
244242

245243
if ($this->isStopOnError()) {
@@ -273,20 +271,25 @@ public function validate(array $onlyChecked = null, $stopOnError = null)
273271
}
274272

275273
/**
276-
* field required Validate 字段存在检查
274+
* field require Validate 字段存在检查
277275
* @param string $field 属性名称
278276
* @param mixed $value 属性值
279277
* @param string $validator required* 验证器
280278
* @param array $args 验证需要的参数
281279
* @return bool
282280
* @throws \InvalidArgumentException
283281
*/
284-
protected function fieldValidate($field, $value, $validator, $args)
282+
protected function fieldValidate(string $field, $value, string $validator, array $args)
285283
{
286284
// required 检查
287285
if ($validator === 'required') {
288286
$passed = $this->required($field, $value);
289287

288+
// 文件资源检查 方法
289+
} elseif (self::isCheckFile($validator)) {
290+
$args = array_values($args);
291+
$passed = $this->$validator($field, ...$args);
292+
290293
// 其他 required* 方法
291294
} elseif (method_exists($this, $validator)) {
292295
$args = array_values($args);
@@ -307,15 +310,14 @@ protected function fieldValidate($field, $value, $validator, $args)
307310

308311
/**
309312
* value Validate 字段值验证
310-
* @param array $data 原始数据列表
311313
* @param string $field 属性名称
312314
* @param mixed $value 属性值
313315
* @param \Closure|string $validator 验证器
314316
* @param array $args 验证需要的参数
315317
* @return bool
316318
* @throws \InvalidArgumentException
317319
*/
318-
protected function valueValidate($data, $field, $value, $validator, $args)
320+
protected function valueValidate(string $field, $value, $validator, array $args)
319321
{
320322
// if field don't exists.
321323
if (null === $value) {
@@ -326,7 +328,7 @@ protected function valueValidate($data, $field, $value, $validator, $args)
326328

327329
// if $validator is a closure OR a object has method '__invoke'
328330
if (\is_object($validator) && method_exists($validator, '__invoke')) {
329-
$args[] = $data;
331+
$args[] = $this->data;
330332
$passed = $validator($value, ...$args);
331333
} elseif (\is_string($validator)) {
332334
// if $validator is a custom add callback in the property {@see $_validators}.
@@ -368,7 +370,7 @@ protected function valueValidate($data, $field, $value, $validator, $args)
368370
* @param string $field
369371
* @param mixed $value
370372
*/
371-
protected function collectSafeValue($field, $value)
373+
protected function collectSafeValue(string $field, $value)
372374
{
373375
// 进行的是子级属性检查 eg: 'goods.apple'
374376
if ($pos = strpos($field, '.')) {
@@ -476,9 +478,28 @@ protected function prepareRule(array &$rule)
476478
}
477479

478480
/*******************************************************************************
479-
* getter/setter
481+
* getter/setter/helper
480482
******************************************************************************/
481483

484+
/**
485+
* @param string $path 'users.*.id'
486+
* @return mixed
487+
*/
488+
protected function getByWildcard(string $path)
489+
{
490+
$result = [];
491+
492+
}
493+
494+
/**
495+
* @param string $path 'users.*.id'
496+
* @return bool
497+
*/
498+
protected function hasWildcard(string $path): bool
499+
{
500+
return strpos($path, '.*') > 0;
501+
}
502+
482503
/**
483504
* @return bool
484505
*/
@@ -623,6 +644,10 @@ public function getRaw(string $key, $default = null)
623644
*/
624645
public function getByPath(string $key, $default = null)
625646
{
647+
if ($this->hasWildcard($key)) {
648+
return $this->getByWildcard($key);
649+
}
650+
626651
return Helper::getValueOfArray($this->data, $key, $default);
627652
}
628653

src/ValidatorList.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,20 @@ public static function hasKey($val, $key)
777777
return false;
778778
}
779779

780+
/**
781+
* 数组里面的值是唯一,不重复的
782+
* @param mixed $val
783+
* @return bool
784+
*/
785+
public static function distinct($val)
786+
{
787+
if (!$val || !\is_array($val)) {
788+
return false;
789+
}
790+
791+
return array_unique($val) === $val;
792+
}
793+
780794
/**
781795
* @param mixed $val
782796
* @param array|string $dict

0 commit comments

Comments
 (0)