eo/media-bundle
A Symfony bundle for managing media files and attachments in your application. It provides upload handling, media entities, storage abstraction, and helpers for serving and organizing images and documents, making it easier to add reusable media management to Symfony projects.
Architecture fit
EoMediaBundle is a Symfony bundle, not a Laravel package — this is the single most important finding for a TPM. Its integration surface is Symfony-specific: a Bundle subclass, a DI extension class with a configuration tree, tagged services, Doctrine ORM entities and event subscribers, and Twig helpers. Laravel's service container is PSR-11-compatible, but none of the bundle's bootstrapping, configuration loading, or framework hooks exist in Laravel. There is no service provider, no config publish path, and no facade.
The bundle is also thin glue. Its value is largely in the wiring it does for Symfony, so lifting the core classes out leaves a small amount of upload/persistence logic that we would have to re-wire and re-test ourselves.
Integration feasibility
Feasible only as a manual shim: instantiate the underlying services by hand, replace Doctrine entities with Eloquent models, replace Symfony filesystem/Kernel paths, and reimplement Twig helpers as Blade directives. That is effectively a rewrite of the integration layer, with the residual upstream code providing little leverage. Effort likely 2–4 engineer-weeks, against a mature alternative that installs in under a day.
Technical risk
Key questions for the evaluation
Recommendation: do not adopt as a dependency. Treat it as a reference implementation only.
Stack fit
Poor. The idiomatic Laravel equivalent is spatie/laravel-medialibrary (media-to-model association, conversions, disk abstraction) or league/flysystem + intervention/image for lower-level control. Both are maintained, PHP 8-ready, and queue-aware.
Migration path (if legacy data exists)
Compatibility
Expect hard blockers, not soft ones: Symfony framework/console/twig constraints, Doctrine ORM/DBAL constraints, and PHP version pins below current. Verify with a throwaway composer require --dry-run in a scratch Laravel skeleton — this is a 30-minute test that should precede any design discussion.
Sequencing
MediaService interface and keep the chosen library behind it. This is the durable TPM-level decision: it makes the library swappable and bounds future vendor risk regardless of which package wins.The critical sequencing point is that the vendor decision should sit behind our own interface, so the choice is reversible.
Maintenance and support
Adoption means we own the code. There is no upstream maintainer responding to issues, no release cadence, and no support channel — 0 dependents means there is essentially no one else running this in production to learn from. Budget for a vendored fork with a named internal owner, and assume the fork accrues its own drift from upstream (i.e., from nothing).
Scaling
The workload is CPU-bound image derivative generation and file I/O. The bundle's Symfony-event-driven design gives us no queue integration out of the box; in Laravel we would have to route conversions through jobs ourselves. Object storage/CDN support is not native and would be an added abstraction. At meaningful media volume, the derivative pipeline — not the persistence layer — is the scaling constraint, and that pipeline is ours to build either way. This further reduces the marginal value of the package.
Failure modes to plan for
composer install breaking on a PHP upgrade, blocking unrelated work. Mitigate by vendoring and pinning.Ramp-up
No documentation, no examples, no community answers. An engineer unfamiliar with the codebase should be assumed to need 3–5 days of source reading before being productive — and that knowledge will be concentrated in one person unless deliberately spread. Contrast this with the 1-day ramp on a maintained Laravel media library, which has docs, tests, and a large body of public troubleshooting.
Bottom line for the roadmap: the expected value of integrating this bundle is negative. The TPM-actionable output is a short, documented "evaluated and rejected" record (so it is not re-litigated), a requirements statement for media handling, and a decision to build behind an internal interface using a maintained library.
How can I help you explore Laravel packages today?