kabuto/dependent-select-bundle
Kabuto DependentSelectBundle adds dependent select fields to Symfony forms, enabling cascading dropdowns whose options update dynamically via AJAX based on parent selections, with straightforward configuration and form integration.
kabuto/dependent-select-bundle is a Symfony bundle, not a Laravel package — no service provider, no config file, no publishable assets, and no adapter path. The most important decision it supports is a rejection: it validates a policy that framework fit is checked before any feature-level evaluation begins.wire:model.live + computed options, or Alpine/Inertia hitting a JSON route). Its real value is as a reference implementation of the pattern, not a runtime dependency.Consider it only if all of the following hold:
Look elsewhere — or build — if any of these are true:
wire:model.live + computed child options), Inertia + Vue/React, or a plain scoped JSON endpoint with an Alpine.js/Stimulus controller.exists:children,id,parent_id,{parentId}). A client-side cascade alone is a data-integrity hole.Questions to close out before any decision: composer.json PHP/Symfony constraints and last commit date; license (MIT or restrictive, since the realistic outcome is template reuse); whether it couples explicitly to Doctrine; whether the AJAX endpoint is authenticated and whitelists which parent fields may be queried; and whether the JS depends on a specific form theme or jQuery version.
To executives (one paragraph): We evaluated kabuto/dependent-select-bundle for cascading form fields and recommend not adopting it. It is a Symfony-only bundle with no community traction (0 stars, 0 dependents), no maintenance signal, and — decisively — it does not run on our Laravel stack. The capability it provides is commodity form UX, not a differentiator, and building it ourselves is roughly one to three engineering days with full control, test coverage, and security review. Taking an unmaintained third-party package into a user-input path would create ongoing bus-factor and security risk for no offsetting gain. Recommendation: build in-house using stack-native tooling (Livewire or Alpine + a scoped JSON endpoint), and reuse this package only as a design reference for the parent-child form pattern.
To engineering (summary): Treat this as a pattern reference, not a dependency — the framework mismatch alone rules out direct integration, and the health signals independently reinforce it. The pattern to implement: a whitelisted JSON route that returns child options for a given parent ID, server-side population and validation of the child field, and a small front-end controller that swaps the child <select> on parent change and clears stale selections. Build it with Livewire or an Alpine component hitting an authorized, scoped route. Non-negotiables: server-side re-validation of the parent-child pairing on submit, authorization on the option endpoint so we don't leak another tenant's taxonomy, request debouncing and in-flight cancellation, a loading state, and an ARIA live region announcing the updated option count. Budget the extra effort for three-level cascades and tenant-scoped option sets — those are the real cost drivers, and no minimal bundle solves them. Document the rejection rationale in a decision record so it isn't re-proposed.
How can I help you explore Laravel packages today?