Skip to content

[php-nextgen] Add anyof Support#24306

Merged
wing328 merged 23 commits into
OpenAPITools:masterfrom
ckoegel:php-nextgen-anyof
Jul 23, 2026
Merged

[php-nextgen] Add anyof Support#24306
wing328 merged 23 commits into
OpenAPITools:masterfrom
ckoegel:php-nextgen-anyof

Conversation

@ckoegel

@ckoegel ckoegel commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

Follow up to #23985
This PR adds support for anyOf models with and without discriminators. It copies the implementation from the oneOf model and updates some of the naming/logic to refer to Composed instead of oneOf or anyOf specifically.

PR checklist

  • Read the contribution guidelines.
  • Run the following to build the project and update samples:
    ./mvnw clean package || exit
    ./bin/generate-samples.sh ./bin/configs/*.yaml || exit
    ./bin/utils/export_docs_generators.sh || exit
    
    (For Windows users, please run the script in WSL)
    Commit all changed files.
    This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
    These must match the expectations made by your contribution.
    You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example ./bin/generate-samples.sh bin/configs/java*.
    IMPORTANT: Do NOT purge/delete any folders/files (e.g. tests) when regenerating the samples as manually written tests may be removed.
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.

@jebentier (2017/07), @dkarlovi (2017/07), @mandrean (2017/08), @jfastnacht (2017/09), @ybelenko (2018/07), @renepardon (2018/12)


Summary by cubic

Adds anyOf support to the PHP Nextgen generator by introducing AnyOfInterface and generated dispatcher models, and updates ObjectSerializer to reliably dispatch oneOf/anyOf with safer JSON decoding. Samples, docs, and tests are regenerated, including new petstore anyOf models.

  • New Features

    • Generate anyOf dispatcher models via model_anyof.mustache; add AnyOfInterface and register it in PhpNextgenClientCodegen.
    • Add deserializeAnyOf() and dispatch for both OneOfInterface and AnyOfInterface in ObjectSerializer; dispatch runs after json_decode and before array-to-object casting.
    • Update model docs to list anyOf members and discriminator selection; skip per-property test stubs for composed models; add petstore Reptile, Smoothie, Lizard, Snake; regenerate echo and petstore samples; add anyOf polymorphism tests.
  • Bug Fixes

    • Preserve original strings when JSON decode fails (including the "null" literal); catch Throwable during deserialization; tighten composed-type validation.

Written for commit 9add223. Summary will update on new commits.

Review in cubic

@ckoegel
ckoegel marked this pull request as ready for review July 15, 2026 14:38

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 35 files

Tip: cubic can generate docs of your entire codebase and keep them up to date. Try it here.

Re-trigger cubic

Comment thread samples/client/echo_api/php-nextgen/src/ObjectSerializer.php Outdated
Comment thread samples/client/petstore/php-nextgen/OpenAPIClient-php/tests/Model/ReptileTest.php Outdated
Comment thread samples/client/petstore/php-nextgen/OpenAPIClient-php/tests/Model/ReptileTest.php Outdated
Comment thread samples/client/petstore/php-nextgen/OpenAPIClient-php/tests/Model/ReptileTest.php Outdated
Comment thread samples/client/echo_api/php-nextgen/src/ObjectSerializer.php Outdated

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 5 files (changes from recent commits).

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

supportingFiles.add(new SupportingFile("ObjectSerializer.mustache", toSrcPath(invokerPackage, srcBasePath), "ObjectSerializer.php"));
supportingFiles.add(new SupportingFile("ModelInterface.mustache", toSrcPath(modelPackage, srcBasePath), "ModelInterface.php"));
supportingFiles.add(new SupportingFile("OneOfInterface.mustache", toSrcPath(modelPackage, srcBasePath), "OneOfInterface.php"));
supportingFiles.add(new SupportingFile("ComposedInterface.mustache", toSrcPath(modelPackage, srcBasePath), "ComposedInterface.php"));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about keeping the OneOfInterface and adding a AnyOfInterface instead?

Renaming OneOfInterface to ComposedInterface is a breaking change if I'm not mistaken.

For other generators we do maintain separate implementations (mustache files) for anyOf and oneOf.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm definitely not opposed to splitting them out, I implemented it this way since the two are so similar to avoid some more duplication. But if we want to match some of the other generators we can definitely migrate to 2 separate models.

This is technically breaking, but the original oneOf implementation hasn't been released yet, so the only people this would break is those using 7.24.0-SNAPSHOT. If that's an issue then we can definitely break these out into oneOf/anyOf. Let me know and I can start on that

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@coffeemakr can you please also review this change when you've time since this is a follow-up PR to #23985 authored by you?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally I prefer making the implementation more consistent to other generators. In addition, the term Composed may not be familiar to developers who just start using OpenAPI in their workflow.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good, I'll get started on this rn

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@wing328 I think this should be all set now, its now split into OneOfInterface and AnyOfInterface, I did leave "Composed" in the ClientCodegen, which shouldn't be breaking and won't ever be seen by users, but lmk if I need to split that out as well.

@wing328

wing328 commented Jul 16, 2026

Copy link
Copy Markdown
Member

also cc @coffeemakr @JulianVennen (top contributors to php-nextgen client generator)

@wing328 wing328 modified the milestones: 7.24.0, 7.25.0 Jul 18, 2026
@ckoegel
ckoegel marked this pull request as draft July 21, 2026 18:17
@ckoegel
ckoegel marked this pull request as ready for review July 21, 2026 19:24

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 36 files

Tip: cubic can generate docs of your entire codebase and keep them up to date. Try it here.

Re-trigger cubic

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed across 4 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

ckoegel and others added 2 commits July 22, 2026 15:20
…tSerializer.mustache

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
@wing328
wing328 merged commit 578c32d into OpenAPITools:master Jul 23, 2026
28 checks passed
@wing328

wing328 commented Jul 23, 2026

Copy link
Copy Markdown
Member

thanks for the PR and incorporating the feedback

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants