浏览代码

Remove array setter when default param type to object

shalvah 2 年之前
父节点
当前提交
f0a3205847
共有 3 个文件被更改,包括 30 次插入11 次删除
  1. 1 1
      src/Extracting/Extractor.php
  2. 7 10
      src/Extracting/ParsesValidationRules.php
  3. 22 0
      tests/Strategies/GetFromFormRequestTest.php

+ 1 - 1
src/Extracting/Extractor.php

@@ -267,7 +267,7 @@ class Extractor
             if (Str::contains($paramName, '.')) { // Object field (or array of objects)
                 self::setObject($cleanParameters, $paramName, $details->example, $parameters, $details->required);
             } else {
-                $cleanParameters[$paramName] = $details->example instanceof \stdClass ? $details->example : $details->example;
+                $cleanParameters[$paramName] = $details->example;
             }
         }
 

+ 7 - 10
src/Extracting/ParsesValidationRules.php

@@ -563,10 +563,9 @@ trait ParsesValidationRules
                 if ($childKey = Arr::first($allKeys, fn($key) => Str::startsWith($key, "$name.*"))) {
                     $childType = ($converted[$childKey] ?? $parameters[$childKey])['type'];
                     $details['type'] = "{$childType}[]";
-                } elseif (Arr::first($allKeys, fn($key) => Str::startsWith($key, "$name."))) {
-                    $details['type'] = 'object';
-                } else {
+                } else { // `array` types default to `object` if no subtype is specified
                     $details['type'] = 'object';
+                    unset($details['setter']);
                 }
             }
 
@@ -620,14 +619,12 @@ trait ParsesValidationRules
                 // and we automatically set this as the example for `data.title`
                 // Note that this approach assumes parent fields are listed before the children; meh.
                 $examples[$details['name']] = $details['example'];
-            } else {
+            } elseif (preg_match('/.+\.[^*]+$/', $details['name'])) {
                 // For object fields (eg 'data.details.title'), set examples from their parents if present as described above.
-                if (preg_match('/.+\.[^*]+$/', $details['name'])) {
-                    [$parentName, $fieldName] = preg_split('/\.(?=[\w-]+$)/', $details['name']);
-                    if (array_key_exists($parentName, $examples) && is_array($examples[$parentName])
-                        && array_key_exists($fieldName, $examples[$parentName])) {
-                        $examples[$details['name']] = $details['example'] = $examples[$parentName][$fieldName];
-                    }
+                [$parentName, $fieldName] = preg_split('/\.(?=[\w-]+$)/', $details['name']);
+                if (array_key_exists($parentName, $examples) && is_array($examples[$parentName])
+                    && array_key_exists($fieldName, $examples[$parentName])) {
+                    $examples[$details['name']] = $details['example'] = $examples[$parentName][$fieldName];
                 }
             }
 

+ 22 - 0
tests/Strategies/GetFromFormRequestTest.php

@@ -176,6 +176,28 @@ class GetFromFormRequestTest extends BaseLaravelTest
         $this->assertEquals($dataExample['meta']['tags'], $parsed['data.meta.tags']['example']);
     }
 
+    /** @test */
+    public function generates_proper_examples_if_not_set()
+    {
+        $strategy = new BodyParameters\GetFromFormRequest(new DocumentationConfig([]));
+        $parametersFromFormRequest = $strategy->getParametersFromValidationRules(
+            [
+                'data' => 'array|required',
+                'data.title' => 'string|required',
+                'data.meta' => 'array',
+                'data.meta.tags' => 'array',
+                'data.meta.tags.*' => 'string',
+            ],
+            []
+        );
+
+        $parsed = $strategy->normaliseArrayAndObjectParameters($parametersFromFormRequest);
+        $this->assertEquals([], $parsed['data']['example']);
+        $this->assertTrue(is_string($parsed['data.title']['example']));
+        $this->assertNull($parsed['data.meta']['example']); // null because not required
+        $this->assertTrue(is_array($parsed['data.meta.tags']['example']));
+        $this->assertTrue(is_string($parsed['data.meta.tags']['example'][0]));
+    }
 
     /** @test */
     public function creates_missing_parent_fields()