sideclick/bootstrap-modal-bundle
Sideclick Bootstrap Modal Bundle helps Symfony applications integrate Bootstrap modals with reusable helpers for rendering dialogs and displaying dynamic content, forms, and AJAX-loaded views in a consistent, template-friendly way.
Architecture fit. Effectively zero for a Laravel codebase. The package is a Symfony bundle — a Bundle class, Symfony DI service definitions, Twig helpers, and a Symfony-side controller/response convention for emitting modal fragments. None of that is discoverable by Laravel's package discovery, loadable by its service container, or consumable by Blade. There is no ServiceProvider, no facade, no Laravel-specific composer.json metadata. The only translatable asset is the pattern: intercept a link, fetch a same-origin route, inject the HTML response into a Bootstrap modal shell, and negotiate fragment-versus-full-page responses on the server. That pattern is framework-agnostic and is the thing worth carrying forward; the dependency itself is not.
Integration feasibility. As a dependency: not feasible. As a pattern port: high feasibility, low cost. A Laravel equivalent is a Blade component for the trigger (<x-modal-link>), a controller concern or middleware that returns a bare view when the request is modal-scoped (e.g. via X-Modal-Request or $request->wantsModal()), and a small vanilla-JS or Alpine listener. Estimated at 1–3 engineer-days including tests and hardening — materially cheaper than reading, adapting, and owning foreign Symfony code, and it lands aligned to our Bootstrap and Laravel versions rather than to a 3.4-era baseline.
Technical risk. High, and disqualifying in aggregate:
script-src violation waiting to happen.Key questions for the team.
Stack fit. Poor as a package; good as a reference. Our stack — Laravel + Blade + Vite + Bootstrap 5 — has idiomatic, first-party-supported answers the Symfony bundle cannot slot into. Preferred implementation: a Blade component for the trigger, a controller-side response strategy (return $request->wantsModal() ? view('partial') : view('page')), and a small Alpine or vanilla-JS handler. HTMX is a viable alternative if the team already uses it and would remove most of the custom JS.
Migration path. There is nothing to migrate from — nothing gets installed. Treat the repository as a read-once reference implementation: (a) clone and read it to extract the modal lifecycle and the fragment/full-page negotiation convention; (b) record those conventions in an internal ADR; (c) build the Laravel equivalent in-house; (d) attribute the inspiration in the ADR for provenance. Do not vendor, fork, or add it to composer.json even as a dev dependency — a dead entry in the lockfile invites accidental use and trips dependency review.
Compatibility. Nothing to verify against, because nothing will be installed. The in-house version must be validated against PHP 8.2/8.3, Laravel 10/11, Bootstrap 5.3, the current CSP policy, and the existing auth middleware stack. One compatibility point deserves explicit callout: modal-fetched routes bypass normal full-page navigation, so middleware that assumes full-page rendering (notably redirect-on-unauthenticated) will silently inject a login page into a modal body. Unauthenticated fetches should return 401 for the JS to surface, not 302.
Sequencing.
aria-modal, Escape handling, focus return on close.Maintenance. The in-house version is ours to own, which is the correct outcome: small, testable, and pinned to our Bootstrap and Laravel versions. Expected recurring cost is a few hours per Laravel or Bootstrap major upgrade for the JS module. Adopting the bundle instead swaps that for maintaining an unmaintained Symfony fork in a stack that cannot run it — a strictly worse posture for less usable output.
Support. No upstream support exists. Zero dependents means no community to escalate to, no issue tracker with traffic, and no compatibility work against current Symfony or PHP. Any defect would be ours to diagnose inside unfamiliar Symfony-shaped code. This alone disqualifies it from any production path.
Scaling. The pattern is request-amplifying by design: every modal open is an additional HTTP round trip on top of the page load. That is fine at normal usage but interacts poorly with (a) high-latency mobile clients, (b) rate-limited or expensive endpoints, and (c) analytics — modal views are not page views and stay invisible to default instrumentation unless explicitly tagged. Mitigations: keep fragments cacheable, preload on hover for the top few triggers, and emit an explicit analytics event. Capacity models should carry a modest multiplier, since server load now scales with interactions rather than sessions.
Failure modes. Enumerate and test these explicitly in the ADR:
Ramp-up. Roughly half a day for the team to learn the internal component — which is itself an argument for building it. The Symfony bundle would impose higher ramp-up for less usable output, since engineers would first have to absorb Symfony bundle conventions to interpret code they cannot execute in our stack. Onboarding cost is a wash at best and negative in practice.
Recommendation. Do not adopt. The framework mismatch is disqualifying on its own; abandonment, Bootstrap-version drift, and the XSS surface reinforce it. Harvest the pattern, build a small owned component, and record the decision in an ADR so the question does not resurface on the roadmap.
How can I help you explore Laravel packages today?