OpenAPITools / openapi-generator

OpenAPI Generator allows generation of API client libraries (SDK generation), server stubs, documentation and configuration automatically given an OpenAPI Spec (v2, v3)
https://openapi-generator.tech
Apache License 2.0
21.58k stars 6.52k forks source link

[PHP] nullable attribute with value null gets removed #2199

Open githubERIK opened 5 years ago

githubERIK commented 5 years ago
Description

Given a nullable field in OpenAPI object

    SomeObject:
      type: object
      properties:
        someProperty:
          type: string
          nullable: true

When HTTP Request has the object and it includes someProperty=null.

Then the generated php client code does not include someProperty in the response.

openapi-generator version

master branch (version 3.3.4) EDIT: also version 4.0.3

OpenAPI declaration file content or url

See the description

Command line used for generation

openapi-generator generate -g php

Steps to reproduce
Related issues/PRs
Suggest a fix/enhancement

Remove null-check if-block if ($value !== null) from https://github.com/OpenAPITools/openapi-generator/blob/master/modules/openapi-generator/src/main/resources/php/ObjectSerializer.mustache#L68

by changing this

if ($value !== null) {
    $values[$data::attributeMap()[$property]] = self::sanitizeForSerialization($value, $openAPIType, $formats[$property]);
}

to this

$values[$data::attributeMap()[$property]] = self::sanitizeForSerialization($value, $openAPIType, $formats[$property]);
wing328 commented 5 years ago

@githubERIK thanks for reporting the issue and sharing the workaround.

But I think in certain use cases, the workaround may introduce additional null values in the payload, which are not present before.

I think we may need to maintain another associative array similar to openAPITypes to indicate if the property is nullable

wing328 commented 5 years ago

I think we may need to maintain another associative array similar to openAPITypes to indicate if the property is nullable

@githubERIK does my comment earlier make sense to you?

githubERIK commented 5 years ago

The comment makes sense.

For nullables in model_generic.mustache,

protected static $openAPINullables = [
    {{#vars}}'{{name}}' => {{#isNullable}}true{{/isNullable}}{{^isNullable}}false{{/isNullable}}{{#hasMore}},
    {{/hasMore}}{{/vars}}
];

could be added and then accessed.

githubERIK commented 5 years ago

Things to keep in mind.

When a request goes out

When a response comes in

jorissteyn commented 4 years ago

API platform supports partial PUT operations: omitting a field in the request does not clear the value on PUT operations. So I'm wondering, the change discussed here, how would the client distinguish nullable fields explicitly set to null versus fields omitted in the payload?

I believe this question is especially important because the client does not support PATCH requests.

gavrochelegnou commented 2 years ago

Hi ! Is there any workaround for this issue ? I'm still having problems forcing a field to null. Thanks