Pārlūkot izejas kodu

Core\Validator: Add support for multidimensional rules arrays

Visman 1 gadu atpakaļ
vecāks
revīzija
5dc6ecfa23
1 mainītis faili ar 37 papildinājumiem un 25 dzēšanām
  1. 37 25
      app/Core/Validator.php

+ 37 - 25
app/Core/Validator.php

@@ -140,13 +140,7 @@ class Validator
     public function addRules(array $list): Validator
     {
         foreach ($list as $field => $raw) {
-            $rules  = [];
-            $suffix = null;
-
-            // правило для элементов массива
-            if (\strpos($field, '.') > 0) {
-                list($field, $suffix) = \explode('.', $field, 2);
-            }
+            $rules = [];
 
             if (! \is_array($raw)) {
                 $raw = \explode('|', $raw);
@@ -182,13 +176,34 @@ class Validator
                 $rules[$name] = $rule ?? '';
             }
 
-            if (isset($suffix)) {
-                $this->rules[$field]['array'][$suffix] = $rules;
+            if (\strpos($field, '.') > 0) {
+                $fields = \explode('.', $field);
+                $n      = \count($fields);
+                $start  = true;
+                $r      = &$this->rules;
+
+                foreach ($fields as $field) {
+                    if (true === $start) {
+                        $this->fields[$field] = $field;
+                        $start                = false;
+                    }
+
+                    if (--$n) {
+                        if (! isset($r[$field]['array'])) {
+                            $r[$field]['array'] = [];
+                        }
+
+                        $r = &$r[$field]['array'];
+                    } else {
+                        $r[$field] = $rules;
+                    }
+                }
+
+                unset ($r);
             } else {
-                $this->rules[$field] = $rules;
+                $this->rules[$field]  = $rules;
+                $this->fields[$field] = $field;
             }
-
-            $this->fields[$field] = $field;
         }
 
         return $this;
@@ -639,35 +654,32 @@ class Validator
         if ('' === $name) {
             $result = $this->checkValue($value, $rules, $field);
         } else {
-            if (! \preg_match('%^([^.]+)(?:\.(.+))?$%', $name, $matches)) {
+            if (false !== \strpos($name, '.')) {
                 throw new RuntimeException("Bad path '{$name}'");
             }
 
-            $key  = $matches[1];
-            $name = $matches[2] ?? '';
-
             if (
-                '*' === $key
+                '*' === $name
                 && \is_array($value)
             ) {
                 foreach ($value as $i => $cur) {
-                    $this->recArray($value[$i], $result[$i], $name, $rules, $field);
+                    $this->recArray($value[$i], $result[$i], '', $rules, $field);
                 }
             } elseif (
-                '*' !== $key
+                '*' !== $name
                 && \is_array($value)
-                && \array_key_exists($key, $value)
+                && \array_key_exists($name, $value)
             ) {
-                $this->recArray($value[$key], $result[$key], $name, $rules, $field);
+                $this->recArray($value[$name], $result[$name], '', $rules, $field);
             } elseif (isset($rules['required'])) {
                 $tmp1 = null;
                 $tmp2 = null;
-                $this->recArray($tmp1, $tmp2, $name, $rules, $field);
-            } elseif ('*' === $key) {
+                $this->recArray($tmp1, $tmp2, '', $rules, $field);
+            } elseif ('*' === $name) {
                 $result = []; // ???? а может там не отсутствие элемента, а не array?
             } else {
-                $value[$key] = null;
-                $this->recArray($value[$key], $result[$key], $name, $rules, $field);
+                $value[$name] = null;
+                $this->recArray($value[$name], $result[$name], '', $rules, $field);
             }
         }
     }