pvtl/voyager-forms
Voyager Forms adds a drag-and-drop form builder and submission management to Laravel's Voyager admin. Create dynamic forms, define fields, publish them, and review entries from the dashboard without custom code.
Architecture fit. pvtl/voyager-forms is an admin module for Voyager, the BREAD-based Laravel admin panel. Architecturally it is a database-driven form builder: administrators define forms and fields in the admin UI, definitions live as rows (not code), and submissions are captured in the host application's schema. That fits a specific profile: a Laravel monolith already standardized on Voyager, a small team, and low-complexity public forms (contact, enquiry, lead capture) that non-developers need to edit without a deploy. It does not fit if forms are a product surface requiring conditional logic, multi-step flows, payments, or integrations — those are outside what a 2020-era Voyager module credibly covers.
Integration feasibility. Mechanically simple: Composer install, register the Voyager module/service provider, run migrations, and the module surfaces in the admin menu. The effort is not in wiring; it is in the compatibility gate. Last release was April 2020, which puts it in the Laravel 6/7 era. Any target on Laravel 9+ should be assumed incompatible until proven otherwise. More importantly, the real dependency is Voyager itself, whose own Laravel/PHP support is community-driven and uneven — that, not this package, is the binding constraint on the platform's upgrade path.
Technical risk. High, and mostly unmanaged by upstream:
composer audit should be treated as a gate, not a formality.Key questions for the team.
mail()?Stack fit. Good for a Voyager-based Laravel monolith with an ops-light team. Poor for API-first/headless, SPA or mobile front-ends (the module renders Blade views and expects server-side POST/CSRF), and poor for any org that wants form definitions versioned in source control.
Migration path. Two distinct cases:
Compatibility work. Audit Composer constraints against the target framework; run composer outdated and composer audit; run migrations against a production-shaped copy of the DB; confirm the Voyager version is pinned and that no other module touches the same tables. Treat PHP 8.x behavior as unverified until exercised.
Sequencing. A four-step path with an explicit decision gate:
Maintenance. The package is a liability by default — there is no upstream to fix anything. Cost resolves to one of two modes: freeze and hope (near-zero effort, rising risk, unquantified until an incident) or own a fork (roughly 0.1–0.2 FTE steady-state, spiking sharply at each framework upgrade). The fork cost is capped by Voyager's own trajectory; if Voyager stalls, the fork buys time rather than a future.
Support. No vendor, no SLA, community-only. Operationally this means an internal runbook is mandatory: how to add a field type, how to diagnose a missing notification, how to recover from a bad migration, who can edit forms. Without it, knowledge concentrates in whoever installed it.
Scaling. Fine for low-volume admin-managed forms. Pressure points are predictable: email dispatch must be queued or submission latency and silent failures follow; file uploads need explicit storage limits and validation; submissions sharing the primary database become a noisy-neighbor risk under load; and the export/reporting path is unverified at volume.
Failure modes to instrument for.
Ramp-up. Steeper than the code size suggests: a developer must learn Voyager's conventions and this module's conventions on top of them. Budget about a week for a mid-level Laravel developer to be productive, and treat bus-factor as a first-class risk — the realistic worst case is that the original implementer leaves and the next upgrade becomes an unplanned rewrite.
Verdict. Archived status, a 2020 release date, and a decaying host framework make this a legacy asset, not a component to invest in. Recommendation: no new adoption; for existing installs, pin, fork, document, and fund an exit — ideally timed to the next Laravel upgrade rather than triggered by an incident.
How can I help you explore Laravel packages today?