Преглед изворни кода

Merge pull request #605 from eschricker/feature/support-nested-array-as-parameter

added support for nested arrays as query parameters for bash examples
Shalvah пре 2 година
родитељ
комит
23810a8bc1
2 измењених фајлова са 36 додато и 14 уклоњено
  1. 25 14
      src/Tools/WritingUtils.php
  2. 11 0
      tests/Unit/WritingUtilsTest.php

+ 25 - 14
src/Tools/WritingUtils.php

@@ -45,25 +45,36 @@ class WritingUtils
     {
         $qs = '';
         foreach ($cleanQueryParams as $paramName => $value) {
-            if (!is_array($value)) {
-                $qs .= "$paramName=" . urlencode($value) . "&";
+            $qs .= static::printSingleQueryParamsAsString('', $paramName, $value, true);
+        }
+
+        return rtrim($qs, '&');
+    }
+
+    public static function printSingleQueryParamsAsString(string $prefix, string|int $key, mixed $parameters, bool $firstLevel): string
+    {
+        if (!is_array($parameters)) {
+            if ($firstLevel) {
+                return sprintf("%s=%s&", urlencode($key), urlencode($parameters));
             } else {
-                if (count($value) == 0) {
-                    continue;
-                }
-                if (array_keys($value)[0] === 0) {
-                    // List query param (eg filter[]=haha should become "filter[]": "haha")
-                    $qs .= "$paramName" . '[]=' . urlencode($value[0]) . '&';
+                if (is_string($key)) {
+                    return sprintf("%s[%s]=%s&", $prefix, urlencode($key), urlencode($parameters));
                 } else {
-                    // Hash query param (eg filter[name]=john should become "filter[name]": "john")
-                    foreach ($value as $item => $itemValue) {
-                        $qs .= "$paramName" . '[' . urlencode($item) . ']=' . urlencode($itemValue) . '&';
-                    }
+                    return sprintf("%s[]=%s&", $prefix, urlencode($parameters));
                 }
             }
+        } else {
+            if ($firstLevel) {
+                $newPrefix = urlencode($key);
+            } else {
+                $newPrefix = sprintf("%s[%s]", $prefix, urlencode($key));
+            }
+            $query = '';
+            foreach ($parameters as $item => $itemValue) {
+                $query .= static::printSingleQueryParamsAsString($newPrefix, $item, $itemValue, false);
+            }
         }
-
-        return rtrim($qs, '&');
+        return $query;
     }
 
     /**

+ 11 - 0
tests/Unit/WritingUtilsTest.php

@@ -61,6 +61,17 @@ class WritingUtilsTest extends BaseLaravelTest
 
     }
 
+    /** @test */
+    public function print_query_params_as_string_bash()
+    {
+        $queryParams = WritingUtils::printQueryParamsAsString($this->queryParams());
+
+        $this->assertEquals(
+            'name+query=name+value&list+query[]=list+element+1&list+query[]=list+element+2&nested+query[nested+query+level+1+array][nested+query+level+2+list][]=nested+level+2+list+element+1&nested+query[nested+query+level+1+array][nested+query+level+2+list][]=nested+level+2+list+element+2&nested+query[nested+query+level+1+array][nested+query+level+2+query]=name+nested+2&nested+query[nested+query+level+1+query]=name+nested+1',
+            $queryParams
+        );
+    }
+    
     private function queryParams(): array
     {
         return [