Bläddra i källkod

Fix rendering of array query params

shalvah 5 år sedan
förälder
incheckning
3543849e06

+ 1 - 5
resources/views/partials/example-requests/javascript.blade.php

@@ -4,11 +4,7 @@ const url = new URL(
 );
 @if(count($route['cleanQueryParameters']))
 
-let params = {
-@foreach($route['cleanQueryParameters'] as $parameter => $value)
-    "{{ $parameter }}": "{{ $value }}",
-@endforeach
-};
+let params = {!! \Mpociot\ApiDoc\Tools\Utils::printQueryParamsAsKeyValue($route['cleanQueryParameters'], "\"", ":", 4, "{}") !!};
 Object.keys(params)
     .forEach(key => url.searchParams.append(key, params[key]));
 @endif

+ 1 - 5
resources/views/partials/example-requests/php.blade.php

@@ -9,11 +9,7 @@ $response = $client->{{ strtolower($route['methods'][0]) }}(
         'headers' => {!! \Mpociot\ApiDoc\Tools\Utils::printPhpValue($route['headers'], 8) !!},
 @endif
 @if(!empty($route['cleanQueryParameters']))
-        'query' => [
-@foreach($route['cleanQueryParameters'] as $parameter => $value)
-            '{{$parameter}}' => '{{$value}}',
-@endforeach
-        ],
+        'query' => {!! \Mpociot\ApiDoc\Tools\Utils::printQueryParamsAsKeyValue($route['cleanQueryParameters'], "'", "=>", 12, "[]", 8) !!},
 @endif
 @if(!empty($route['cleanBodyParameters']))
         'json' => {!! \Mpociot\ApiDoc\Tools\Utils::printPhpValue($route['cleanBodyParameters'], 8) !!},

+ 1 - 7
resources/views/partials/example-requests/python.blade.php

@@ -7,13 +7,7 @@ url = '{{ rtrim($baseUrl, '/') }}/{{ ltrim($route['boundUri'], '/') }}'
 payload = {!! json_encode($route['cleanBodyParameters'], JSON_PRETTY_PRINT) !!}
 @endif
 @if(count($route['cleanQueryParameters']))
-params = {
-@foreach($route['cleanQueryParameters'] as $parameter => $value)
-  '{{ $parameter }}': '{{ $value }}'@if(!($loop->last)),
-@endif
-@endforeach
-
-}
+params = {!! \Mpociot\ApiDoc\Tools\Utils::printQueryParamsAsKeyValue($route['cleanQueryParameters'], "'", ":", 2, "{}") !!}
 @endif
 @if(!empty($route['headers']))
 headers = {

+ 44 - 5
src/Tools/Utils.php

@@ -3,6 +3,7 @@
 namespace Mpociot\ApiDoc\Tools;
 
 use Illuminate\Routing\Route;
+use Illuminate\Support\Arr;
 use League\Flysystem\Adapter\Local;
 use League\Flysystem\Filesystem;
 use Symfony\Component\Console\Output\ConsoleOutput;
@@ -116,18 +117,23 @@ class Utils
         return $result;
     }
 
-    public static function printQueryParamsAsString(array $cleanQueryParams)
+    public static function printQueryParamsAsString(array $cleanQueryParams): string
     {
         $qs = "";
         foreach ($cleanQueryParams as $parameter => $value) {
             $paramName = urlencode($parameter);
 
             if (!is_array($value)) {
-                $qs .= "$paramName=" . urlencode($value)."&";
+                $qs .= "$paramName=" . urlencode($value) . "&";
             } else {
-                // Query param is array - only one level of nesting supported
-                foreach ($value as $item => $itemValue) {
-                    $qs .= "$paramName" . "[" . urlencode($item) . "]=" . urlencode($itemValue)."&";
+                if (array_keys($value)[0] === 0) {
+                    // List query param (eg filter[]=haha should become "filter[]": "haha")
+                    $qs .= "$paramName" . "[]=" . urlencode($value[0]) . "&";
+                } else {
+                    // Hash query param (eg filter[name]=john should become "filter[name]": "john")
+                    foreach ($value as $item => $itemValue) {
+                        $qs .= "$paramName" . "[" . urlencode($item) . "]=" . urlencode($itemValue) . "&";
+                    }
                 }
 
             }
@@ -135,4 +141,37 @@ class Utils
 
         return rtrim($qs, '&');
     }
+
+    public static function printQueryParamsAsKeyValue(
+        array $cleanQueryParams,
+        string $quote = "\"",
+        string $delimiter = ":",
+        int $spacesIndentation = 4,
+        string $braces = "{}",
+        int $closingBraceIndentation = 0
+    ): string
+    {
+        $output = "{$braces[0]}\n";
+        foreach ($cleanQueryParams as $parameter => $value) {
+            if (!is_array($value)) {
+                $output .= str_repeat(" ", $spacesIndentation);
+                    $output .= "$quote$parameter$quote$delimiter $quote$value$quote,\n";
+            } else {
+                if (array_keys($value)[0] === 0) {
+                    // List query param (eg filter[]=haha should become "filter[]": "haha")
+                    $output .= str_repeat(" ", $spacesIndentation);
+                    $output .= "$quote$parameter"."[]$quote$delimiter $quote$value[0]$quote,\n";
+                } else {
+                    // Hash query param (eg filter[name]=john should become "filter[name]": "john")
+                    foreach ($value as $item => $itemValue) {
+                        $output .= str_repeat(" ", $spacesIndentation);
+                        $output .= "$quote$parameter"."[$item]$quote$delimiter $quote$itemValue$quote,\n";
+                    }
+                }
+
+            }
+        }
+
+        return $output.str_repeat(" ", $closingBraceIndentation)."{$braces[1]}";
+    }
 }