diff --git a/src/Illuminate/Contracts/Validation/CompilableRules.php b/src/Illuminate/Contracts/Validation/CompilableRules.php new file mode 100644 index 000000000000..2907824026ae --- /dev/null +++ b/src/Illuminate/Contracts/Validation/CompilableRules.php @@ -0,0 +1,17 @@ +callback, $value, $attribute, $data, $context); - $parser = new ValidationRuleParser( - Arr::undot(Arr::wrap($data)) - ); - - if (is_array($rules) && ! array_is_list($rules)) { - $nested = []; - - foreach ($rules as $key => $rule) { - $nested[$attribute.'.'.$key] = $rule; - } - - $rules = $nested; - } else { - $rules = [$attribute => $rules]; - } - - return $parser->explode(ValidationRuleParser::filterConditionalRules($rules, $data)); + return Rule::compile($attribute, $rules, $data); } } diff --git a/src/Illuminate/Validation/Rule.php b/src/Illuminate/Validation/Rule.php index 18da0c9c3921..44bb2b4347b5 100644 --- a/src/Illuminate/Validation/Rule.php +++ b/src/Illuminate/Validation/Rule.php @@ -3,6 +3,7 @@ namespace Illuminate\Validation; use Illuminate\Contracts\Support\Arrayable; +use Illuminate\Support\Arr; use Illuminate\Support\Traits\Macroable; use Illuminate\Validation\Rules\ArrayRule; use Illuminate\Validation\Rules\Can; @@ -244,4 +245,33 @@ public static function numeric() { return new Numeric; } + + /** + * Compile a set of rules for an attribute. + * + * @param string $attribute + * @param array $rules + * @param array|null $data + * @return object|\stdClass + */ + public static function compile($attribute, $rules, $data = null) + { + $parser = new ValidationRuleParser( + Arr::undot(Arr::wrap($data)) + ); + + if (is_array($rules) && ! array_is_list($rules)) { + $nested = []; + + foreach ($rules as $key => $rule) { + $nested[$attribute.'.'.$key] = $rule; + } + + $rules = $nested; + } else { + $rules = [$attribute => $rules]; + } + + return $parser->explode(ValidationRuleParser::filterConditionalRules($rules, $data)); + } } diff --git a/src/Illuminate/Validation/ValidationRuleParser.php b/src/Illuminate/Validation/ValidationRuleParser.php index c7fafbfa2149..c54fa2ce4370 100644 --- a/src/Illuminate/Validation/ValidationRuleParser.php +++ b/src/Illuminate/Validation/ValidationRuleParser.php @@ -3,6 +3,7 @@ namespace Illuminate\Validation; use Closure; +use Illuminate\Contracts\Validation\CompilableRules; use Illuminate\Contracts\Validation\InvokableRule; use Illuminate\Contracts\Validation\Rule as RuleContract; use Illuminate\Contracts\Validation\ValidationRule; @@ -138,7 +139,7 @@ protected function prepareRule($rule, $attribute) return $rule; } - if ($rule instanceof NestedRules) { + if ($rule instanceof CompilableRules) { return $rule->compile( $attribute, $this->data[$attribute] ?? null, Arr::dot($this->data), $this->data )->rules[$attribute]; @@ -164,7 +165,7 @@ protected function explodeWildcardRules($results, $attribute, $rules) foreach ($data as $key => $value) { if (Str::startsWith($key, $attribute) || (bool) preg_match('/^'.$pattern.'\z/', $key)) { foreach ((array) $rules as $rule) { - if ($rule instanceof NestedRules) { + if ($rule instanceof CompilableRules) { $context = Arr::get($this->data, Str::beforeLast($key, '.')); $compiled = $rule->compile($key, $value, $data, $context); @@ -238,7 +239,7 @@ protected function mergeRulesForAttribute($results, $attribute, $rules) */ public static function parse($rule) { - if ($rule instanceof RuleContract || $rule instanceof NestedRules) { + if ($rule instanceof RuleContract || $rule instanceof CompilableRules) { return [$rule, []]; }