krma-cl/kcfinder-symfony-bundle
Symfony bundle that integrates KCFinder, the web-based file manager and uploader for CKEditor, into Symfony applications. It simplifies configuration, routing, and asset setup so users can browse, upload, and manage files directly from the editor.
Architecture fit — poor for a Laravel product. The artefact under review is krma-cl/kcfinder-symfony-bundle, a Symfony bundle wrapping KCFinder — a legacy standalone PHP file manager/browser historically shipped with CKEditor. It is not a Laravel package: there is no service provider contract, no facade, no config/ publish idiom, no Blade/Livewire surface. Architecturally KCFinder is a self-contained HTTP application (its own bootstrap, $_SESSION/$_FILES coupling, global functions) mounted as an edge surface. That is containable — it does not pollute domain layers — but it introduces a second request entry point and a second notion of "session" and "authenticated user" into the application.
Integration feasibility — possible, but hand-built. Adoption in Laravel requires an adapter: a service provider shim, translation of the Symfony config tree into Laravel config, route re-registration, and an authorization gate (KCFinder's own ACL is session-based and historically weak). The v1.0.0 release note contains no content — only a changelog URL, which the data set does not include. We therefore cannot state what changed relative to pre-1.0. A 1.0.0 tag is a stability claim, not evidence of hardening. Treat the release as "unversioned code given a label."
Technical risk — high. Enumerate for the risk register:
$_SESSION. Laravel's session drivers (Redis, cookie, database) do not hand it a native session; bridging this correctly is non-trivial and a common source of silent auth bypass.Key questions to put to the maintainer / to the team:
Stack fit — moderate at best, conditional. If the organisation also operates Symfony services, the bundle fits there natively and should be evaluated in that context instead. For the Laravel estate, treat it as a third-party edge appliance, never as an application component.
Migration path. Do not adopt directly into product code. Sequence: vendor the bundle behind an owned FileBrowser interface so the implementation is swappable; mount KCFinder on a dedicated route group with its own middleware stack (auth, rate limit, upload size caps); keep its session and storage concerns fully outside application code. If it must be used, the interface boundary is the deliverable that makes the eventual removal cheap.
Compatibility work required before commit: verify PHP version support; decide whether KCFinder gets an isolated session store (recommended) rather than bridging Laravel's; confirm the Symfony routing config can be re-registered through Laravel's router or bypassed with a raw include; confirm storage is local-disk-bound (KCFinder writes to disk — Flysystem/S3 is not native) and design around it.
Sequencing (gated — do not compress):
Stages 1–2 are cheap and can kill the initiative. Run them before committing any sprint capacity.
Maintenance. You inherit the Symfony-side glue permanently, plus a largely dormant upstream. Every Laravel and PHP minor upgrade becomes a re-validation exercise with no upstream guarantee. Budget a recurring line item, not a one-off.
Support. Single-maintainer GitHub project; no vendor, no SLA, no published security policy or disclosure timeline. The escalation path is an issue tracker. For a customer-facing upload surface this is a material support gap — document it as an accepted risk or decline.
Scaling. Session-bound and local-filesystem-bound. Multi-node deployments require shared storage; horizontal scaling breaks silently if instances do not share the upload volume. Uploads traverse PHP-FPM, so upload_max_filesize, post_max_size, memory and time limits all become capacity-planning inputs. No native object-store support means CDN/offload patterns need custom work.
Failure modes to monitor. Silent upload failures (size/limit/session); path traversal and upload-execution if the upload directory is web-served; session collisions with application auth producing intermittent 403s or, worse, cross-user access; orphaned files on partial writes; unbounded storage growth absent quota enforcement; and dependency rot surfacing as a fatal error on the next PHP upgrade.
Ramp-up. Deceptively easy — a PHP developer can read it in an afternoon, which is precisely the trap. Operating it safely requires security review capability most teams do not carry in-house. Plan for external review time, not just developer time.
TPM recommendation. Do not adopt into a Laravel product on the strength of a v1.0.0 tag whose release notes contain no content. Open it as a formal risk-register item, run the licence and security gates first, and cost the build-it-ourselves alternative in the same breath. If adopted, it is an untrusted third-party surface with a named owner, a pinned commit, a scheduled re-review, and a documented exit path — not a package install.
How can I help you explore Laravel packages today?