mezcalito/ux-filemanager
A Laravel package that adds a ready-to-use file manager UI for browsing, uploading, renaming, and deleting files and folders on your configured storage disks. Ideal for admin panels, it offers a simple, customizable way to manage files without building CRUD screens.
Delta in 0.1.7. The release adds Symfony 8 and PHP 8.5 support (feat: Symfony 8 + PHP 8.5 support). It is a compatibility-window release — no new features, no security fix, no API change called out. It does not alter the core finding: mezcalito/ux-filemanager is a Symfony UX bundle, not a Laravel package. It sharpens three details that matter to us: the PHP floor, the Symfony component alignment, and how far the frontend glue has drifted from Laravel conventions.
Architecture fit — the headline risk, unchanged. The package's value is split across two layers with very different portability:
Storage facade is itself a Flysystem v3 wrapper, so the domain problem is shared.Net: what you'd actually reuse is a few hundred lines of service logic and a set of UI patterns — not the package as shipped.
Integration feasibility. Three viable paths, in descending order of effort:
app/Services, re-implement templates in Blade, and pull the Stimulus controllers into the Vite build (Stimulus works fine under Vite; it's Twig that doesn't). This is a fork, not an install. New wrinkle: code shaped for PHP 8.5 may use syntax (property hooks, asymmetric visibility, newer typed-constant idioms) our runtime can't parse — downleveling is now a line item.Technical risk. Several compounding signals, one of them newly sharpened:
composer.json. This is a fork-and-extract package either way, but it removes any residual "just try composer require and see" option.Key questions before committing:
^7.0|^8.0? A narrow pin confirms it can never co-exist with Laravel's dependency graph; a wide constraint keeps the sidecar path cheap and makes the extracted code easier to read.composer.json require set does 0.1.7 declare? If it's >=8.4, assume 8.4/8.5 syntax in the domain classes and budget a downlevel pass.Storage), or hard-wired to a Symfony Flysystem service?Stack fit. The genuine overlap is at storage: Laravel Storage → Flysystem 3 → local/S3. If the package's file operations sit on an injectable filesystem interface, a Laravel adapter is a bounded task. The UI layer has no overlap — plan for a full rebuild in Blade + Vite, reusing the Stimulus controllers only if their DOM contracts are clean. Treat 0.1.7's Symfony 8 alignment as a signal that those contracts are still moving.
Migration path. Realistically: extract, don't install. 0.1.7 reinforces this — with a Symfony 8 pin, composer require into a Laravel app is not merely unwise, it likely won't resolve.
composer.json in a Laravel app.Storage, Validator, Gate/Policy for per-file authorization.Compatibility. Expect friction at the container boundary — Symfony bundle Extension classes and services.yaml don't load under Laravel's container. 0.1.7 makes version alignment the first thing to check, not the last: confirm the PHP floor against your runtime and confirm whether the package assumes symfony/ux-turbo at the HTTP layer (it may return Turbo Stream responses, which your Laravel endpoints won't produce without work).
Sequencing.
composer.json, service definitions, and the upload handler at tag 0.1.7. Produce an LOC-split estimate and an 8.4+/8.5-syntax inventory.Storage::disk('s3') behind a Laravel policy.Do not sequence UI first; the tempting demo is the part you'll throw away. The 2–3 day spike estimate holds — reading composer.json is now a slightly higher-value first step than before.
Maintenance. Assume you own the code the moment you integrate. With zero dependents and effectively one contributor, upstream fixes are best-effort — though 0.1.7 is a fair signal the maintainer intends to track modern Symfony/PHP, which reduces abandonment risk without eliminating it. Budget for a fork you periodically rebase — or better, budget for a permanent divergence where you stop tracking upstream entirely. The 0.1.7 constraint bump is the kind of change that creates merge pain on rebase for zero functional gain on our side; that argues for divergence. Either way, name an owner.
Support. MIT, community-only, no SLA, no commercial backing. Acceptable for internal tooling; a poor fit for anything customer-facing where a broken upload is a revenue event. The 8.x alignment is a maintenance signal, not a support commitment — don't read it as one.
Scaling. Unchanged, and unaffected by the release — file management scales with the storage backend, not the package:
upload_max_filesize / post_max_size and request timeouts — plan direct-to-S3 presigned uploads rather than proxying bytes through PHP-FPM.Failure modes to instrument explicitly:
.. after resolution, not before. Still unaudited in 0.1.7.Content-Type or extension alone.Ramp-up. Two audiences, two costs:
Verdict. Not an installable dependency for a Laravel stack — it's a reference implementation and partial extraction source. 0.1.7 is a positive maintenance signal and a negative integration signal: it confirms the project is alive while pushing its compatibility window (Symfony 8, PHP 8.5) further from a current Laravel app. Worth a bounded 2–3 day spike given the overlap at the Flysystem layer and the security-checklist value of reading a working implementation. Not worth a sidecar service. Recommend: spike at tag 0.1.7, then very likely build native with this as a spec.
How can I help you explore Laravel packages today?