metglobal/dto-bundle
A Symfony bundle for working with data transfer objects (DTOs), making it easier to convert request or array data into typed PHP objects instead of loose arrays. Helps keep controllers and services cleaner by centralizing data mapping and structure.
Architecture fit. The package is a Symfony bundle (metglobal/dto-bundle), not a Laravel package — and that mismatch is the headline finding. Laravel has no bundle registration mechanism: the Bundle subclass, the DI Extension, compiler passes, and the services.yaml conventions that carry this library's actual wiring have no runtime in a Laravel application. What survives portage is only the framework-agnostic core — most likely an abstract DTO base class with fromArray/toArray, type coercion, and mapping metadata. That is a small, replaceable slice of functionality, and it is a fraction of what the package nominally offers.
Integration feasibility: low. The repository is archived, sits at 2 stars with 0 dependents, and is scored 0.05 — there is no release cadence, no issue triage, and no security advisory path. Dependency constraints almost certainly target PHP 7.x and Symfony 3.4/4.x. Against Laravel 10/11/12 on PHP 8.1+, expect composer require to either fail outright or force a resolution that downgrades symfony/* packages shared with the framework. The MIT license is permissive and unproblematic; the abandonment is the problem, not the legal terms.
Technical risk. Assessed as high on every axis:
| Risk | Severity | Rationale |
|---|---|---|
| Dependency conflict | High | Stale PHP/Symfony constraints vs. modern Laravel |
| Abandonment | High | Archived; no CVE response, no PHP minor support |
| Mapping-layer semantics | Medium | Coercion/serialization edge cases are where DTO bugs hide |
| Annotation dependency | Medium | If mapping is annotation-based, doctrine/annotations 2.x removal breaks it |
| Ecosystem vacuum | Medium | Zero dependents, 2 stars = no StackOverflow corpus, no battle-testing |
| Vendor credibility | Low | Metglobal is a legitimate travel-tech firm; the artifact is simply unmaintained |
Key questions for the requesting team.
The honest default recommendation is do not adopt. spatie/laravel-data covers the same ground with active maintenance; PHP 8.1+ readonly classes plus hand-written fromArray cover the minimal case with zero dependency surface.
Stack fit. There is no clean fit. The table below frames the gap for the sponsor:
| Need | This package | Laravel-native equivalent |
|---|---|---|
| DTO base + hydration | Framework-agnostic core only | spatie/laravel-data, or readonly classes |
| Container wiring | Symfony DI extension — inert in Laravel | Native service container |
| Validation | Unclear; likely Symfony Validator | Laravel Validator / FormRequests |
| Serialization | Symfony Serializer | Laravel resources, JsonResource |
| Lifecycle | Archived | Maintained, versioned, tested |
Migration path. If a business constraint forces adoption, do not install the bundle. Fork the repository into an internal namespace, strip the Symfony bundle/DI layer, retain only the core DTO classes, add PHP 8.2/8.3 CI, and publish as an internal Composer package. That converts an unmaintained third-party dependency into a small, owned, auditable component — the only configuration in which the risk is survivable.
Compatibility. Pin the fork's constraints explicitly rather than inheriting upstream's. Reconcile against the current composer.lock before any code is written; if resolution requires downgrading shared symfony/* or illuminate/* packages, stop — that is a framework-wide regression, not a package-level one. Verify whether mapping uses Doctrine annotations; if so, budget for an attributes migration, since the annotation reader is gone in current releases.
Sequencing.
spatie/laravel-data vs. plain readonly classes. Default to the second or third.Maintenance. A fork means the team owns the code outright: PHP minor upgrades, security patches, and bug fixes all become internal work items with no upstream to defer to. SBOM and SCA tooling will flag the package as abandoned, generating recurring noise that has to be waived explicitly and re-justified at each audit. That waiver becomes a permanent piece of governance overhead disproportionate to what the library does.
Support. No upstream maintainer, no issue tracker activity, no community. A 2-star, 0-dependent package has essentially no public knowledge base — every question is answered by reading the source. Onboarding a new engineer means a code-reading exercise with no documentation to anchor it.
Scaling. Runtime performance is not the concern; DTO mapping is CPU-light and will not be the bottleneck at any plausible volume. The scaling risk is organizational: each PHP or Laravel upgrade becomes a bespoke internal migration rather than a composer update, and that cost compounds with every service that adopts the fork.
Failure modes. Watch for silent type coercion on nullable and nested fields (the classic DTO bug class, and the hardest to catch in review); annotation-reader removal breaking mapping wholesale on a dependency bump; serializer output drifting from what downstream consumers expect; and Composer lock churn where the fork's constraints pin the application's shared dependencies. The most damaging failure is the quiet one — a Laravel upgrade blocked for a quarter because one internal package cannot move.
Ramp-up. Low for the core classes (a day to read), high for the surrounding judgment — engineers must know which parts of the original bundle are inert, which are load-bearing, and why the package exists at all. That context lives only in whoever performed the fork, which is a single-point-of-failure pattern.
Bottom line. The package's score and archive status reflect reality. The cost of adopting and owning it exceeds the cost of writing the equivalent in readonly classes by a wide margin, and spatie/laravel-data removes the question entirely. Recommend rejecting adoption and recording the decision so it is not re-litigated.
How can I help you explore Laravel packages today?