diff --git a/modules/openapi-generator/src/main/resources/php-laravel/api_controller.mustache b/modules/openapi-generator/src/main/resources/php-laravel/api_controller.mustache index f927c45aa75d..06dc97b27756 100644 --- a/modules/openapi-generator/src/main/resources/php-laravel/api_controller.mustache +++ b/modules/openapi-generator/src/main/resources/php-laravel/api_controller.mustache @@ -41,43 +41,43 @@ class {{controllerName}} extends Controller {{#allParams}} {{^isPathParam}} {{#isFile}} - ${{paramName}} = $request->file('{{paramName}}'); + ${{paramName}} = $request->file('{{baseName}}'); {{/isFile}} {{#isBoolean}} - ${{paramName}} = $request->boolean('{{paramName}}'); + ${{paramName}} = $request->boolean('{{baseName}}'); {{/isBoolean}} {{#isInteger}} - ${{paramName}} = $request->integer('{{paramName}}'); + ${{paramName}} = $request->integer('{{baseName}}'); {{/isInteger}} {{#isLong}} - ${{paramName}} = $request->integer('{{paramName}}'); + ${{paramName}} = $request->integer('{{baseName}}'); {{/isLong}} {{#isNumber}} - ${{paramName}} = $request->float('{{paramName}}'); + ${{paramName}} = $request->float('{{baseName}}'); {{/isNumber}} {{#isFloat}} - ${{paramName}} = $request->float('{{paramName}}'); + ${{paramName}} = $request->float('{{baseName}}'); {{/isFloat}} {{#isDouble}} - ${{paramName}} = $request->float('{{paramName}}'); + ${{paramName}} = $request->float('{{baseName}}'); {{/isDouble}} {{#isString}} - ${{paramName}} = $request->string('{{paramName}}')->value(); + ${{paramName}} = $request->string('{{baseName}}')->value(); {{/isString}} {{#isByteArray}} - ${{paramName}} = $request->string('{{paramName}}')->value(); + ${{paramName}} = $request->string('{{baseName}}')->value(); {{/isByteArray}} {{#isDateTime}} - ${{paramName}} = $request->date('{{paramName}}'); + ${{paramName}} = $request->date('{{baseName}}'); {{/isDateTime}} {{#isDate}} - ${{paramName}} = $request->date('{{paramName}}'); + ${{paramName}} = $request->date('{{baseName}}'); {{/isDate}} {{#isArray}} - ${{paramName}} = $request->get('{{paramName}}'); + ${{paramName}} = $request->get('{{^isBodyParam}}{{baseName}}{{/isBodyParam}}{{#isBodyParam}}{{paramName}}{{/isBodyParam}}'); {{/isArray}} {{#isMap}} - ${{paramName}} = $request->get('{{paramName}}'); + ${{paramName}} = $request->get('{{^isBodyParam}}{{baseName}}{{/isBodyParam}}{{#isBodyParam}}{{paramName}}{{/isBodyParam}}'); {{/isMap}} {{^isPrimitiveType}} {{^isContainer}} diff --git a/modules/openapi-generator/src/main/resources/php-laravel/api_validation.mustache b/modules/openapi-generator/src/main/resources/php-laravel/api_validation.mustache index 8ec946c761ba..f5e018dff637 100644 --- a/modules/openapi-generator/src/main/resources/php-laravel/api_validation.mustache +++ b/modules/openapi-generator/src/main/resources/php-laravel/api_validation.mustache @@ -1,14 +1,14 @@ $validator = Validator::make( array_merge( + $request->all(), [ - {{#pathParams}}'{{paramName}}' => ${{paramName}},{{/pathParams}} + {{#pathParams}}'{{baseName}}' => ${{paramName}},{{/pathParams}} ], - $request->all(), ), [ {{#allParams}} {{^bodyParam}} - '{{paramName}}' => [ + '{{baseName}}' => [ {{#isFile}} 'file', {{/isFile}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/php/laravel/PhpLaravelServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/php/laravel/PhpLaravelServerCodegenTest.java new file mode 100644 index 000000000000..8c2aa00bc498 --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/php/laravel/PhpLaravelServerCodegenTest.java @@ -0,0 +1,72 @@ +package org.openapitools.codegen.php.laravel; + +import org.openapitools.codegen.ClientOptInput; +import org.openapitools.codegen.DefaultGenerator; +import org.openapitools.codegen.TestUtils; +import org.openapitools.codegen.config.CodegenConfigurator; +import org.testng.annotations.Test; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PhpLaravelServerCodegenTest { + + /** + * Parameters whose spec (wire) name is not already a valid camelCase PHP identifier must be read + * from the request and validated under the wire name ({@code baseName}), not under the sanitized + * PHP variable name ({@code paramName}). Otherwise the generated controller reads the wrong key + * and the value is always null. + */ + @Test + public void shouldUseWireNameForRequestLookupsAndValidationKeys() throws Exception { + Map properties = new HashMap<>(); + + File output = Files.createTempDirectory("test").toFile(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("php-laravel") + .setAdditionalProperties(properties) + .setInputSpec("src/test/resources/3_0/php-laravel/petstore-with-fake-endpoints-models-for-testing.yaml") + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + DefaultGenerator generator = new DefaultGenerator(); + List files = generator.opts(clientOptInput).generate(); + + TestUtils.ensureContainsFile(files, output, "Http/Controllers/FakeController.php"); + TestUtils.ensureContainsFile(files, output, "Http/Controllers/StoreController.php"); + TestUtils.ensureContainsFile(files, output, "Http/Controllers/UserController.php"); + + Path fakeController = files.stream().filter(f -> f.getName().equals("FakeController.php")).findFirst().orElseThrow().toPath(); + + // request accessors use the wire name (snake_case) while the local variable keeps the sanitized name + TestUtils.assertFileContains(fakeController, "$filterClientName = $request->string('filter_client_name')->value();"); + TestUtils.assertFileContains(fakeController, "$filterUserIds = $request->get('filter_user_ids');"); + TestUtils.assertFileContains(fakeController, "$clientId = $request->integer('client_id');"); + + // validation rule keys must match $request->all(), i.e. the wire name + TestUtils.assertFileContains(fakeController, "'filter_client_name' => ["); + TestUtils.assertFileContains(fakeController, "'filter_user_ids' => ["); + TestUtils.assertFileContains(fakeController, "'client_id' => ["); + + // the buggy behaviour (reading under the sanitized identifier) must not reappear + TestUtils.assertFileNotContains(fakeController, "$request->string('filterClientName')"); + TestUtils.assertFileNotContains(fakeController, "$request->get('filterUserIds')"); + TestUtils.assertFileNotContains(fakeController, "$request->integer('clientId')"); + + // path parameters: the merged validation key and the rule key both use the wire name + Path storeController = files.stream().filter(f -> f.getName().equals("StoreController.php")).findFirst().orElseThrow().toPath(); + TestUtils.assertFileContains(storeController, "'order_id' => $orderId,"); + TestUtils.assertFileContains(storeController, "'order_id' => ["); + + // body parameters are out of scope and must stay byte-identical: no wire-name substitution for the request body + Path userController = files.stream().filter(f -> f.getName().equals("UserController.php")).findFirst().orElseThrow().toPath(); + TestUtils.assertFileContains(userController, "$user = $request->get('user');"); + + output.deleteOnExit(); + } +} diff --git a/modules/openapi-generator/src/test/resources/3_0/php-laravel/petstore-with-fake-endpoints-models-for-testing.yaml b/modules/openapi-generator/src/test/resources/3_0/php-laravel/petstore-with-fake-endpoints-models-for-testing.yaml index 129129a4d916..6a30b91c864f 100644 --- a/modules/openapi-generator/src/test/resources/3_0/php-laravel/petstore-with-fake-endpoints-models-for-testing.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/php-laravel/petstore-with-fake-endpoints-models-for-testing.yaml @@ -995,6 +995,49 @@ paths: required: - param - param2 + /fake/parameter-name-mapping: + get: + tags: + - fake + summary: test query parameter name sanitization + description: 'Query params whose spec names require PHP identifier sanitization (snake_case) must be read/validated under the wire name.' + operationId: getParameterNameMapping + parameters: + - name: filter_client_name + in: query + required: false + schema: + type: string + - name: filter_user_ids + in: query + required: false + schema: + type: array + items: + type: integer + responses: + '200': + description: successful operation + post: + tags: + - fake + summary: test form parameter name sanitization + description: 'Form param whose spec name requires PHP identifier sanitization (snake_case) must be read/validated under the wire name.' + operationId: postParameterNameMapping + responses: + '200': + description: successful operation + requestBody: + content: + application/x-www-form-urlencoded: + schema: + type: object + properties: + client_id: + description: form field whose name requires sanitization + type: integer + required: + - client_id /fake/additionalProperties-reference: post: tags: diff --git a/samples/server/petstore/php-laravel-issue-21334/Http/Controllers/DefaultController.php b/samples/server/petstore/php-laravel-issue-21334/Http/Controllers/DefaultController.php index 5e7777e6f921..95e38821d750 100644 --- a/samples/server/petstore/php-laravel-issue-21334/Http/Controllers/DefaultController.php +++ b/samples/server/petstore/php-laravel-issue-21334/Http/Controllers/DefaultController.php @@ -51,10 +51,10 @@ public function getDummy(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ 'paramCamelCase' => [ diff --git a/samples/server/petstore/php-laravel/Api/FakeApiInterface.php b/samples/server/petstore/php-laravel/Api/FakeApiInterface.php index 5868028c10a4..78b1335a05af 100644 --- a/samples/server/petstore/php-laravel/Api/FakeApiInterface.php +++ b/samples/server/petstore/php-laravel/Api/FakeApiInterface.php @@ -124,6 +124,36 @@ public function fakePropertyEnumIntegerSerialize( ; + /** + * Operation getParameterNameMapping + * + * test query parameter name sanitization + * @param null | string $filterClientName + * @param null | int[] $filterUserIds + * @return \OpenAPI\Server\Model\NoContent200 + */ + public function getParameterNameMapping( + ?string $filterClientName, + ?array $filterUserIds, + ): + \OpenAPI\Server\Model\NoContent200 + ; + + + /** + * Operation postParameterNameMapping + * + * test form parameter name sanitization + * @param int $clientId + * @return \OpenAPI\Server\Model\NoContent200 + */ + public function postParameterNameMapping( + int $clientId, + ): + \OpenAPI\Server\Model\NoContent200 + ; + + /** * Operation testAdditionalPropertiesReference * diff --git a/samples/server/petstore/php-laravel/Http/Controllers/AnotherFakeController.php b/samples/server/petstore/php-laravel/Http/Controllers/AnotherFakeController.php index c9c95266069a..0a0bf0093672 100644 --- a/samples/server/petstore/php-laravel/Http/Controllers/AnotherFakeController.php +++ b/samples/server/petstore/php-laravel/Http/Controllers/AnotherFakeController.php @@ -51,10 +51,10 @@ public function call123TestSpecialTags(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], diff --git a/samples/server/petstore/php-laravel/Http/Controllers/DefaultController.php b/samples/server/petstore/php-laravel/Http/Controllers/DefaultController.php index 935abd69c438..b46f6e67f599 100644 --- a/samples/server/petstore/php-laravel/Http/Controllers/DefaultController.php +++ b/samples/server/petstore/php-laravel/Http/Controllers/DefaultController.php @@ -51,10 +51,10 @@ public function fooGet(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], diff --git a/samples/server/petstore/php-laravel/Http/Controllers/FakeClassnameTags123Controller.php b/samples/server/petstore/php-laravel/Http/Controllers/FakeClassnameTags123Controller.php index f1892d121046..f0d9cb95e09b 100644 --- a/samples/server/petstore/php-laravel/Http/Controllers/FakeClassnameTags123Controller.php +++ b/samples/server/petstore/php-laravel/Http/Controllers/FakeClassnameTags123Controller.php @@ -51,10 +51,10 @@ public function testClassname(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], diff --git a/samples/server/petstore/php-laravel/Http/Controllers/FakeController.php b/samples/server/petstore/php-laravel/Http/Controllers/FakeController.php index 0a6dd13f7aaa..1bdecc066ecd 100644 --- a/samples/server/petstore/php-laravel/Http/Controllers/FakeController.php +++ b/samples/server/petstore/php-laravel/Http/Controllers/FakeController.php @@ -51,10 +51,10 @@ public function fakeBigDecimalMap(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -85,10 +85,10 @@ public function fakeHealthGet(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -119,10 +119,10 @@ public function fakeHttpSignatureTest(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -134,9 +134,9 @@ public function fakeHttpSignatureTest(Request $request): JsonResponse $pet = $this->serde->deserialize($request->getContent(), from: 'json', to: \OpenAPI\Server\Model\Pet::class); - $query1 = $request->string('query1')->value(); + $query1 = $request->string('query_1')->value(); - $header1 = $request->string('header1')->value(); + $header1 = $request->string('header_1')->value(); $apiResult = $this->api->fakeHttpSignatureTest($pet, $query1, $header1); @@ -159,10 +159,10 @@ public function fakeOuterBooleanSerialize(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -195,10 +195,10 @@ public function fakeOuterCompositeSerialize(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -231,10 +231,10 @@ public function fakeOuterNumberSerialize(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -267,10 +267,10 @@ public function fakeOuterStringSerialize(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -303,10 +303,10 @@ public function fakePropertyEnumIntegerSerialize(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -326,6 +326,90 @@ public function fakePropertyEnumIntegerSerialize(Request $request): JsonResponse } + // This shouldn't happen + return response()->abort(500); + } + /** + * Operation getParameterNameMapping + * + * test query parameter name sanitization. + * + */ + public function getParameterNameMapping(Request $request): JsonResponse + { + $validator = Validator::make( + array_merge( + $request->all(), + [ + + ], + ), + [ + 'filter_client_name' => [ + 'string', + ], + 'filter_user_ids' => [ + 'array', + ], + ], + ); + + if ($validator->fails()) { + return response()->json(['error' => 'Invalid input'], 400); + } + + $filterClientName = $request->string('filter_client_name')->value(); + + $filterUserIds = $request->get('filter_user_ids'); + + + $apiResult = $this->api->getParameterNameMapping($filterClientName, $filterUserIds); + + if ($apiResult instanceof \OpenAPI\Server\Model\NoContent200) { + return response()->json($this->serde->serialize($apiResult, format: 'array'), 200); + } + + + // This shouldn't happen + return response()->abort(500); + } + /** + * Operation postParameterNameMapping + * + * test form parameter name sanitization. + * + */ + public function postParameterNameMapping(Request $request): JsonResponse + { + $validator = Validator::make( + array_merge( + $request->all(), + [ + + ], + ), + [ + 'client_id' => [ + 'required', + 'integer', + ], + ], + ); + + if ($validator->fails()) { + return response()->json(['error' => 'Invalid input'], 400); + } + + $clientId = $request->integer('client_id'); + + + $apiResult = $this->api->postParameterNameMapping($clientId); + + if ($apiResult instanceof \OpenAPI\Server\Model\NoContent200) { + return response()->json($this->serde->serialize($apiResult, format: 'array'), 200); + } + + // This shouldn't happen return response()->abort(500); } @@ -339,10 +423,10 @@ public function testAdditionalPropertiesReference(Request $request): JsonRespons { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -375,10 +459,10 @@ public function testBodyWithBinary(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -411,10 +495,10 @@ public function testBodyWithFileSchema(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -447,10 +531,10 @@ public function testBodyWithQueryParams(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -485,10 +569,10 @@ public function testClientModel(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -521,10 +605,10 @@ public function testEndpointParameters(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ 'number' => [ @@ -537,7 +621,7 @@ public function testEndpointParameters(Request $request): JsonResponse 'gte:67.8', 'lte:123.4', ], - 'patternWithoutDelimiter' => [ + 'pattern_without_delimiter' => [ 'required', 'regex:/^[A-Z].*/', 'string', @@ -592,7 +676,7 @@ public function testEndpointParameters(Request $request): JsonResponse $double = $request->float('double'); - $patternWithoutDelimiter = $request->string('patternWithoutDelimiter')->value(); + $patternWithoutDelimiter = $request->string('pattern_without_delimiter')->value(); $byte = $request->string('byte')->value(); @@ -641,31 +725,31 @@ public function testGroupParameters(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ - 'requiredStringGroup' => [ + 'required_string_group' => [ 'required', 'integer', ], - 'requiredBooleanGroup' => [ + 'required_boolean_group' => [ 'required', 'boolean', ], - 'requiredInt64Group' => [ + 'required_int64_group' => [ 'required', 'integer', ], - 'stringGroup' => [ + 'string_group' => [ 'integer', ], - 'booleanGroup' => [ + 'boolean_group' => [ 'boolean', ], - 'int64Group' => [ + 'int64_group' => [ 'integer', ], ], @@ -675,17 +759,17 @@ public function testGroupParameters(Request $request): JsonResponse return response()->json(['error' => 'Invalid input'], 400); } - $requiredStringGroup = $request->integer('requiredStringGroup'); + $requiredStringGroup = $request->integer('required_string_group'); - $requiredBooleanGroup = $request->boolean('requiredBooleanGroup'); + $requiredBooleanGroup = $request->boolean('required_boolean_group'); - $requiredInt64Group = $request->integer('requiredInt64Group'); + $requiredInt64Group = $request->integer('required_int64_group'); - $stringGroup = $request->integer('stringGroup'); + $stringGroup = $request->integer('string_group'); - $booleanGroup = $request->boolean('booleanGroup'); + $booleanGroup = $request->boolean('boolean_group'); - $int64Group = $request->integer('int64Group'); + $int64Group = $request->integer('int64_group'); $apiResult = $this->api->testGroupParameters($requiredStringGroup, $requiredBooleanGroup, $requiredInt64Group, $stringGroup, $booleanGroup, $int64Group); @@ -708,10 +792,10 @@ public function testInlineAdditionalProperties(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -744,10 +828,10 @@ public function testInlineFreeformAdditionalProperties(Request $request): JsonRe { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -780,10 +864,10 @@ public function testJsonFormData(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ 'param' => [ @@ -826,10 +910,10 @@ public function testNullable(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -862,10 +946,10 @@ public function testQueryParameterCollectionFormat(Request $request): JsonRespon { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ 'pipe' => [ @@ -936,10 +1020,10 @@ public function testStringMapReference(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], diff --git a/samples/server/petstore/php-laravel/Http/Controllers/PetController.php b/samples/server/petstore/php-laravel/Http/Controllers/PetController.php index 176f158b706f..6ed5473d0eb1 100644 --- a/samples/server/petstore/php-laravel/Http/Controllers/PetController.php +++ b/samples/server/petstore/php-laravel/Http/Controllers/PetController.php @@ -51,10 +51,10 @@ public function addPet(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -91,17 +91,17 @@ public function deletePet(Request $request, int $petId): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ 'petId' => $petId, ], - $request->all(), ), [ 'petId' => [ 'required', 'integer', ], - 'apiKey' => [ + 'api_key' => [ 'string', ], ], @@ -112,7 +112,7 @@ public function deletePet(Request $request, int $petId): JsonResponse } - $apiKey = $request->string('apiKey')->value(); + $apiKey = $request->string('api_key')->value(); $apiResult = $this->api->deletePet($petId, $apiKey); @@ -139,10 +139,10 @@ public function findPetsByStatus(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ 'status' => [ @@ -185,10 +185,10 @@ public function findPetsByTags(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ 'tags' => [ @@ -230,10 +230,10 @@ public function getPetById(Request $request, int $petId): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ 'petId' => $petId, ], - $request->all(), ), [ 'petId' => [ @@ -277,10 +277,10 @@ public function updatePet(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -325,10 +325,10 @@ public function updatePetWithForm(Request $request, int $petId): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ 'petId' => $petId, ], - $request->all(), ), [ 'petId' => [ @@ -378,10 +378,10 @@ public function uploadFile(Request $request, int $petId): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ 'petId' => $petId, ], - $request->all(), ), [ 'petId' => [ @@ -427,10 +427,10 @@ public function uploadFileWithRequiredFile(Request $request, int $petId): JsonRe { $validator = Validator::make( array_merge( + $request->all(), [ 'petId' => $petId, ], - $request->all(), ), [ 'petId' => [ diff --git a/samples/server/petstore/php-laravel/Http/Controllers/StoreController.php b/samples/server/petstore/php-laravel/Http/Controllers/StoreController.php index 4ec956115979..09abcd193484 100644 --- a/samples/server/petstore/php-laravel/Http/Controllers/StoreController.php +++ b/samples/server/petstore/php-laravel/Http/Controllers/StoreController.php @@ -51,13 +51,13 @@ public function deleteOrder(Request $request, string $orderId): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ - 'orderId' => $orderId, + 'order_id' => $orderId, ], - $request->all(), ), [ - 'orderId' => [ + 'order_id' => [ 'required', 'string', ], @@ -94,10 +94,10 @@ public function getInventory(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -129,13 +129,13 @@ public function getOrderById(Request $request, int $orderId): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ - 'orderId' => $orderId, + 'order_id' => $orderId, ], - $request->all(), ), [ - 'orderId' => [ + 'order_id' => [ 'required', 'gte:1', 'lte:5', @@ -178,10 +178,10 @@ public function placeOrder(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], diff --git a/samples/server/petstore/php-laravel/Http/Controllers/UserController.php b/samples/server/petstore/php-laravel/Http/Controllers/UserController.php index 7ad1326083d6..62790a4920d0 100644 --- a/samples/server/petstore/php-laravel/Http/Controllers/UserController.php +++ b/samples/server/petstore/php-laravel/Http/Controllers/UserController.php @@ -51,10 +51,10 @@ public function createUser(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -87,10 +87,10 @@ public function createUsersWithArrayInput(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -123,10 +123,10 @@ public function createUsersWithListInput(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -159,10 +159,10 @@ public function deleteUser(Request $request, string $username): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ 'username' => $username, ], - $request->all(), ), [ 'username' => [ @@ -202,10 +202,10 @@ public function getUserByName(Request $request, string $username): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ 'username' => $username, ], - $request->all(), ), [ 'username' => [ @@ -249,10 +249,10 @@ public function loginUser(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ 'username' => [ @@ -299,10 +299,10 @@ public function logoutUser(Request $request): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ ], - $request->all(), ), [ ], @@ -333,10 +333,10 @@ public function updateUser(Request $request, string $username): JsonResponse { $validator = Validator::make( array_merge( + $request->all(), [ 'username' => $username, ], - $request->all(), ), [ ], diff --git a/samples/server/petstore/php-laravel/routes.php b/samples/server/petstore/php-laravel/routes.php index be8a6779f598..5094104c94ca 100644 --- a/samples/server/petstore/php-laravel/routes.php +++ b/samples/server/petstore/php-laravel/routes.php @@ -90,6 +90,20 @@ */ Route::POST('/v2/fake/property/enum-int', [\OpenAPI\Server\Http\Controllers\FakeController::class, 'fakePropertyEnumIntegerSerialize'])->name('fake.fake.property.enum.integer.serialize'); +/** + * GET getParameterNameMapping + * Summary: test query parameter name sanitization + * Notes: Query params whose spec names require PHP identifier sanitization (snake_case) must be read/validated under the wire name. + */ +Route::GET('/v2/fake/parameter-name-mapping', [\OpenAPI\Server\Http\Controllers\FakeController::class, 'getParameterNameMapping'])->name('fake.get.parameter.name.mapping'); + +/** + * POST postParameterNameMapping + * Summary: test form parameter name sanitization + * Notes: Form param whose spec name requires PHP identifier sanitization (snake_case) must be read/validated under the wire name. + */ +Route::POST('/v2/fake/parameter-name-mapping', [\OpenAPI\Server\Http\Controllers\FakeController::class, 'postParameterNameMapping'])->name('fake.post.parameter.name.mapping'); + /** * POST testAdditionalPropertiesReference * Summary: test referenced additionalProperties