PHP generator omits QueryParameter class import for snake_case query parameters
- Dominant language
- C#
- Stars
- 3.8k
- Forks
- 333
- Avg merge
- 16h 29m
- Merged PRs (30d)
- 116
Description
### What are you generating using Kiota, clients or plugins?
API Client/SDK
### In what context or format are you using Kiota?
Linux executable
### Client library/SDK language
PHP
### Describe the bug
When a PHP client is generated from an OpenAPI spec that has a query parameter whose name is renamed by the generator (e.g. snake_case like `category_id` → `categoryId`), the resulting `*RequestBuilderGetQueryParameters.php` file contains the `@QueryParameter("category_id")` docblock annotation but does **not** import `Microsoft\Kiota\Abstractions\QueryParameter`.
At runtime, `Microsoft\Kiota\Abstractions\RequestInformation::setQueryParameters()` resolves the annotation through Doctrine's `AnnotationReader`, which requires a matching `use` statement in the file. The missing import produces:
```
Doctrine\Common\Annotations\AnnotationException:
[Semantical Error] The annotation "@QueryParameter" in property
...RequestBuilderGetQueryParameters::$categoryId was never imported.
Did you maybe forget to add a "use" statement for this annotation?
```
Every request that passes query parameters to such an endpoint throws this exception, making the generated client unusable against the affected operations.
### Expected behavior
When using `@QueryParameter`, the generated code should import the correct class `use Microsoft\Kiota\Abstractions\QueryParameter;`
### How to reproduce
Generate php application based on the open-api spec and see that we are missing the import.
```
docker run --rm -v .:/app/output -v ./openapi.yaml:/app/openapi.yaml \
mcr.microsoft.com/openapi/kiota:1.31.0 generate \
-l PHP \
-c ReproClient \
-n Example\\ReproClient \
-o /app/output/src --co
```
### Open API description file
openapi: 3.0.3
info:
title: Repro
version: 1.0.0
servers:
- url: https://example.test/api
paths:
/things:
get:
operationId: listThings
parameters:
- name: category_id
in: query
schema:
type: string
responses:
"200":
description: OK
### Kiota Version
1.31.0
### Latest Kiota version known to work for scenario above?(Not required)
_No response_
### Known Workarounds
_No response_
### Configuration
_No response_
### Debug output
Click to expand log
```
info: Kiota.Builder.KiotaBuilder[659500454]
Cleaning output directory /app/output/src
dbug: Kiota.Builder.KiotaBuilder[1405590561]
kiota version 1.31.0
info: Kiota.Builder.KiotaBuilder[1423726202]
loaded description from local source
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 1 - reading the stream - took 00:00:00.0044530
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 2 - parsing the document - took 00:00:00.0346265
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 3 - updating generation configuration from kiota extension - took 00:00:00.0000635
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 4 - filtering API paths with patterns - took 00:00:00.0017065
info: Kiota.Builder.KiotaBuilder[543457275]
Client root URL set to https://example.test/api
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 5 - checking whether the output should be updated - took 00:00:00.0088611
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 6 - create uri space - took 00:00:00.0011084
dbug: Kiota.Builder.KiotaBuilder[1605292753]
InitializeInheritanceIndex 00:00:00.0013523
dbug: Kiota.Builder.KiotaBuilder[1605292753]
CreateRequestBuilderClass 00:00:00
dbug: Kiota.Builder.KiotaBuilder[1605292753]
MapTypeDefinitions 00:00:00.0149445
dbug: Kiota.Builder.KiotaBuilder[1605292753]
TrimInheritedModels 00:00:00
dbug: Kiota.Builder.KiotaBuilder[1605292753]
CleanUpInternalState 00:00:00
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 7 - create source model - took 00:00:00.0379782
dbug: Kiota.Builder.KiotaBuilder[1306343761]
16ms: Language refinement applied
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 8 - refine by language - took 00:00:00.0182923
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 9 - writing files - took 00:00:00.0139909
info: Kiota.Builder.KiotaBuilder[1423726202]
loaded description from local source
dbug: Kiota.Builder.KiotaBuilder[1605292753]
step 10 - writing lock file - took 00:00:00.0064115
Generation completed successfully
Client base url set to https://example.test/api
dbug: Kiota.Builder.KiotaBuilder[2121673205]
Api manifest path: /app/apimanifest.json
```
### Other information
_No response_
Contributor guide
Research direction
Reproduce the issue with the provided Docker command and inspect the generated *RequestBuilderGetQueryParameters.php file for the snake_case query parameter. Trace the PHP generator logic responsible for its annotation imports; done when the generated file imports Microsoft\Kiota\Abstractions\QueryParameter and requests using the parameter no longer raise the Doctrine annotation exception.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- php
- Domain
- tooling
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 68/100