diff --git a/src/FieldValidation.php b/src/FieldValidation.php index 79e4474..4d0b45d 100644 --- a/src/FieldValidation.php +++ b/src/FieldValidation.php @@ -47,13 +47,17 @@ protected function collectRules() } // an rule for special scene. if (!empty($rule['on'])) { + if (!$scene) { + continue; + } $sceneList = \is_string($rule['on']) ? array_map('trim', explode(',', $rule['on'])) : (array)$rule['on']; - if ($scene && !\in_array($scene, $sceneList, true)) { + if (!\in_array($scene, $sceneList, true)) { continue; } unset($rule['on']); - $this->_usedRules[] = $rule; } + + $this->_usedRules[] = $rule; $field = array_shift($rule); if (\is_object($rule[0])) { (yield $field => $rule); diff --git a/src/ValidationTrait.php b/src/ValidationTrait.php index 837a121..e183e9f 100644 --- a/src/ValidationTrait.php +++ b/src/ValidationTrait.php @@ -360,18 +360,19 @@ protected function collectRules() if (!isset($rule[1]) || !$rule[1]) { throw new \InvalidArgumentException('The rule validator is must be setting! position: rule[1].'); } - // global rule. - if (empty($rule['on'])) { - $this->_usedRules[] = $rule; - // only use to special scene. - } else { + // only use to special scene. + if (!empty($rule['on'])) { + if (!$scene) { + continue; + } $sceneList = \is_string($rule['on']) ? Helper::explode($rule['on']) : (array)$rule['on']; - if ($scene && !\in_array($scene, $sceneList, true)) { + if (!\in_array($scene, $sceneList, true)) { continue; } unset($rule['on']); - $this->_usedRules[] = $rule; } + + $this->_usedRules[] = $rule; $fields = array_shift($rule); (yield $fields => $this->prepareRule($rule)); diff --git a/src/ValidatorList.php b/src/ValidatorList.php index b235209..d22e62b 100644 --- a/src/ValidatorList.php +++ b/src/ValidatorList.php @@ -562,14 +562,23 @@ public static function strList($val) /** * 验证字段值是否是一个有效的 JSON 字符串。 - * @param string $val + * @param mixed $val + * @param bool $strict * @return bool */ - public static function json($val) + public static function json($val, $strict = true) { if (!$val || (!\is_string($val) && !method_exists($val, '__toString'))) { return false; } + + $val = (string)$val; + + // must start with: { OR [ + if ($strict && '[' !== $val[0] && '{' !== $val[0]) { + return false; + } + json_decode($val); return json_last_error() === JSON_ERROR_NONE;