Skip to content

Release 2.8.0: generate data object classes from a JSON, XML, array or Eloquent sample - #15

Merged
yuriizee merged 1 commit into
mainfrom
release/2.8.0
Oct 16, 2026
Merged

yuriizee merged 1 commit into
mainfrom
release/2.8.0

Conversation

@yuriizee

Copy link
Copy Markdown
Contributor

Added

  • vendor/bin/sdo-generate <sample.json|sample.xml|-> <output-dir> writes data object classes from a sample document: one class per object shape, with property types, nested DTOs, #[DataCollection] lists and key mapping (#[TransformKeys], #[MapPropertyName], #[XmlAttribute] / #[XmlText] / #[XmlElement]) inferred from the values. Options: --class, --namespace (default from the PSR-4 map), --xml-path, --optional, --dry-run, --force.
  • DataClassGenerator::fromValue() / write() — the same for any PHP array or object.
  • make:data --from-json, --from-xml, and --from-model=… --id=… [--with=…] (generates from a real record; loaded relations become nested classes, $hidden attributes are left out).
  • Docs: features/code-generation.md, make:data section, README.

Verification

  • Tests hydrate the generated classes from their own sample: JSON with --optional round-trips byte for byte; XML via lazyXml(); make:data --id against a SQLite model with a hasMany relation.
  • Docker: 909 tests, 100% line coverage (2462/2462); PHPStan level 6 clean; Infection covered MSI 86%.
  • No hydration/serialization code changed.

Backward compatible with 2.7.x; make:data --from-model without --id is unchanged.

…r Eloquent sample

- bin/sdo-generate <sample.json|sample.xml|-> <dir> infers one class per
  object shape: property types, nested DTOs, #[DataCollection] lists and key
  mapping (#[TransformKeys], #[MapPropertyName], XML attribute/text/element).
  --optional maps keys missing from some objects to T|Optional for an exact
  round trip; --namespace defaults to the composer.json PSR-4 map.
- DataClassGenerator::fromValue() and write() for any PHP array or object.
- make:data --from-json, --from-xml and --from-model --id [--with]: the last
  generates from a real record with its loaded relations.
@yuriizee
yuriizee merged commit 8c280cc into main Oct 16, 2026
6 checks passed
@yuriizee
yuriizee deleted the release/2.8.0 branch October 16, 2026 18:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant