diff --git a/src/Utils/SchemaGenerator.php b/src/Utils/SchemaGenerator.php index c896d9d..874dbdd 100644 --- a/src/Utils/SchemaGenerator.php +++ b/src/Utils/SchemaGenerator.php @@ -183,6 +183,10 @@ private function buildParameterSchema(array $paramInfo, ?array $methodLevelParam // Parameter-level takes highest precedence $parameterLevelSchema = $paramInfo['parameter_schema']; if (!empty($parameterLevelSchema)) { + if (isset($parameterLevelSchema['definition']) && is_array($parameterLevelSchema['definition'])) { + return $parameterLevelSchema['definition']; + } + $mergedSchema = $this->mergeSchemas($mergedSchema, $parameterLevelSchema); } diff --git a/tests/Fixtures/Utils/SchemaGeneratorFixture.php b/tests/Fixtures/Utils/SchemaGeneratorFixture.php index 34a5605..db8373b 100644 --- a/tests/Fixtures/Utils/SchemaGeneratorFixture.php +++ b/tests/Fixtures/Utils/SchemaGeneratorFixture.php @@ -397,4 +397,17 @@ public function parameterSchemaInferredType( $inferredParam ): void { } + + /** + * Parameter with complete custom definition via #[Schema(definition: ...)] + */ + public function parameterWithRawDefinition( + #[Schema(definition: [ + 'description' => 'Custom-defined schema', + 'type' => 'string', + 'format' => 'uuid' + ])] + string $custom + ): void { + } } diff --git a/tests/Integration/SchemaGenerationTest.php b/tests/Integration/SchemaGenerationTest.php index f40b936..9cf7215 100644 --- a/tests/Integration/SchemaGenerationTest.php +++ b/tests/Integration/SchemaGenerationTest.php @@ -354,3 +354,16 @@ expect($schema['required'])->toEqual(['inferredParam']); }); + +it('uses raw parameter-level schema definition as-is', function () { + $method = new ReflectionMethod(SchemaGeneratorFixture::class, 'parameterWithRawDefinition'); + $schema = $this->schemaGenerator->generate($method); + + expect($schema['properties']['custom'])->toEqual([ + 'description' => 'Custom-defined schema', + 'type' => 'string', + 'format' => 'uuid' + ]); + + expect($schema['required'])->toEqual(['custom']); +});