Skip to content

ParameterValidatorProvider::getProperty() fails when Parameter::getOpenApi() returns an array (e.g. DateFilter QueryParameter) #7408

@pentiminax

Description

@pentiminax

API Platform version(s) affected: 4.2.0

Description

When using a QueryParameter with a DateFilter, API Platform generates multiple OpenAPI parameters
(revisionDate[after], revisionDate[before], etc.).

In ParameterValidatorProvider::getProperty(), $parameter->getOpenApi() then returns an array of
ApiPlatform\OpenApi\Model\Parameter objects.

But the code assumes it's an object or null:

if ('deepObject' === $openApi?->getStyle()) {
    ...
}

This leads to a fatal error when the required parameter is missing:

Call to a member function getStyle() on array
vendor/api-platform/core/src/Symfony/Validator/State/ParameterValidatorProvider.php:122

How to reproduce

new QueryParameter(
   key: 'revisionDate',
   filter: new DateFilter(),
   required: true
),

Make a request withous specifying required parameter

Possible Solution

if (is_array($openApi)) {
            $match = null;
            foreach ($openApi as $oaParam) {
                if ($oaParam instanceof Parameter) {
                    if ($oaParam->getKey() === $key || str_starts_with($oaParam->getName(), $key.'[')) {
                        $match = $oaParam;
                        break;
                    }
                }
            }

            $openApi = $match ?? reset($openApi);
        }

Also setting "openApi: false" to the QueryParameter works

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions