orchestra/html
Orchestra/Html is an HTML and form builder for Laravel, offering a fluent API to generate markup, forms, and Bootstrap-friendly components. It extends Laravel's HTML helpers with reusable macros, cleaner syntax, and convenient builders for rapid view development.
orchestra/html is a scoped internal accelerator for admin/back-office CRUD and extension screens. It shortens time-to-form on internal tooling, so it can legitimately unblock an internal admin milestone — but it should never appear on a customer-facing roadmap line. Decide which side of that line the work sits on before deciding whether the package matters.orchestra/foundation, making reuse near-free. If it doesn't, build — a handful of internal Blade components delivers the same convenience (model binding, CSRF, old-input repopulation) without the maintenance and escape/XSS audit burden.Form::raw(), Html::raw()) require a security and UX audit before any external exposure — that audit is a cost line, not a footnote.illuminate/* version audit → license and transitive footprint check → thin internal adapter → documented exit plan. If Composer resolution fails against your Laravel version, take the no-go. Do not fork to widen the constraint unless an existing Orchestra extension hard-depends on it.Form::control() collapses label + input + error markup, and Form::model() eliminates hand-written old('name', $model->name) everywhere. That is a measurable per-form saving across a CRUD-heavy admin milestone — which is the entire business case. Price the offsetting work too: control() does not reliably wire validation state, so error styling is manual, and any non-Bootstrap-3 theme needs class overrides.orchestra/support, which is a weak maintenance signal. Treat upkeep as an owned internal cost, not a vendor-handled one. If this becomes load-bearing for an internal admin workflow, allocate owner time for upgrades, escaping/XSS verification, and eventual replacement.Orchestra\Html types never appear in domain code — views call an adapter or Blade component instead. This converts a potential codebase-wide rewrite into a one-file change and keeps the exit plan credible. If someone starts extending Orchestra\Html\FormBuilder, they have coupled too far; intervene then, not at migration time.Consider it when:
composer show orchestra/html first — it often arrives transitively, so adoption cost and blast radius are both near zero and confined to admin screens.illuminate/* and Orchestra compatibility, transitive footprint, license, test coverage, release cadence, and the escaping/XSS posture of raw() helpers. Treat these as gates, not diligence theater.Look elsewhere when:
_token on nested forms, model state bleeding across a missing Form::close(), facade alias collisions with Laravel Collective) is one you discover and debug yourself.Form and Html; whichever provider registers last wins. You can end up with a builder whose methods exist but behave differently. If you cannot guarantee registration order, skip it.To executives — one paragraph: orchestra/html is a small internal accelerator for admin and back-office forms, not a platform bet. If we're already on Orchestra Platform it's likely installed already, so the cost of using it is close to zero and the benefit is direct: less hand-written markup per admin screen, faster internal CRUD delivery. The trade-off is that nobody else depends on it — the release history is thin — so we use it deliberately, keep it behind a thin internal wrapper, and never put it in front of customers. If we're not on Orchestra, we shouldn't adopt it; a few internal Blade components get us the same thing with no dependency.
To engineering — the operating rules:
composer show orchestra/html, run php artisan package:discover, and check get_class(app('form')). If it resolves to Collective\Html\..., that's a registration bug — fix it before debugging any rendering issue.Form::model() and Form::control(). Model binding is the highest-leverage feature: value population, old-input repopulation, and method spoofing for free. Any hand-written old('name', $model->name) is a signal you're fighting the builder.FieldFactory or Blade component layer means swapping to native Blade later is a one-file change, not a find-and-replace across the codebase. No Orchestra\Html type hints in domain code; no extending Orchestra\Html\FormBuilder.{!! !!} for anything control() returns; audit every raw() call as review-required; add has-error/is-invalid yourself since the wrapper doesn't wire validation state; watch for unclosed forms bleeding model state and duplicate _token inputs causing 419s._token appears exactly once — duplicate CSRF silently breaks POSTs and is trivially caught by a string count.composer.lock with a documented upgrade procedure, and write the exit plan before the fifth form, not after.How can I help you explore Laravel packages today?