Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Html Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. orchestra/html is a thin convenience layer, not an architectural component. It binds form and html into the Laravel container and aliases the Form/Html facades, wrapping Laravel Collective's builders with a small set of Orchestra-specific additions — control(), raw(), and macro support. That means it sits at the edge of the system (view composition), and its blast radius is genuinely small if you keep it there. It is a fit for the narrow case it was built for: CRUD and configuration screens inside an Orchestra Platform admin/back-office. It is not a fit as a design-system foundation, a public-facing rendering layer, or anything a Livewire/Blade-component architecture already covers. The honest framing for the roadmap is "scoped internal accelerator," not "strategic dependency."

Integration feasibility. Feasibility hinges almost entirely on one question: is the application already on Orchestra Platform? If yes, the package typically arrives transitively via orchestra/foundation, adoption cost is near zero, and the decision is really reuse vs. ignore. If no, integration is a deliberate composer require with a thin independent value proposition — a handful of helpers that native Blade components replicate in an afternoon. With 0 dependents and a package score of ~0.3, there is no ecosystem signal to lean on and no social proof to de-risk the choice. The illuminate/* and collective/html constraints in composer.json are the real gate; if Composer refuses resolution against the target Laravel version, that is a no-go, not a fork-and-patch candidate.

Technical risk. Concentrated in four places, none of them exotic:

  • Facade/binding collision. Both this package and Laravel Collective alias Form and Html. Registration order determines which builder answers, and methods can "exist" while behaving differently. This is a day-one debugging tax, not a runtime catastrophe, but it is invisible until behaviour looks wrong.
  • Escaping correctness. control() returns markup and must be echoed raw; raw() deliberately bypasses escaping. Every Form::raw() / Html::raw() call is effectively a reviewed-security surface. An XSS regression here is low-probability but high-impact if it reaches anything customer-visible.
  • Silent form breakage. Duplicate _token inputs (419s), Form::model() state bleeding across an unclosed form, and control() not wiring validation error state are all failure modes that render fine and fail on submit or fail quietly. They are cheap to catch with assertions, expensive to discover in production admin workflows.
  • Presentation debt. Bootstrap-3-era markup against a Bootstrap 5 or Tailwind admin theme means class overrides or wrappers. Acceptable for internal screens; a hard stop for a design-system-critical surface.

Key questions.

  1. Does the app already resolve orchestra/html transitively, and does app('form') return Orchestra\Html\FormBuilder?
  2. Does Composer resolve cleanly against our pinned Laravel version without widening constraints?
  3. Is every candidate surface internal/admin and non-revenue-critical?
  4. Do we have an owner with budget to carry upgrades and escape/XSS verification?
  5. What is the exit cost if we standardize on it — is the surface bounded by an adapter, or are there Orchestra\Html type hints in domain code?

Integration Approach

Stack fit. Suitable for Orchestra Platform / Laravel applications with server-rendered Blade admin views and no competing form abstraction. Poor fit where a Blade component library, Livewire, Inertia, or a design system already owns form markup — introducing a second convention there creates exactly the fragmentation the package was meant to remove. The realistic use case is create/edit forms on the fifth nearly-identical admin screen: model binding, CSRF, method spoofing, and old-input repopulation absorbed by the builder.

Migration path. Do not migrate existing views. Introduce the package opportunistically on new internal forms, or on forms already being touched, with Form::control() as the default field wrapper and Form::model() mandated for every edit screen. Keep the surface bounded: register house-style macros in boot() with a team prefix (houseText, adminSelect) so they cannot collide with Orchestra, Collective, or a future package, and keep macro bodies to markup composition only. Route generation goes through named routes (Form::open(['route' => ...])), never hard-coded admin URLs, because Orchestra mounts extensions behind a platform prefix. The migration is an adoption-by-attrition path, not a refactor.

Compatibility. Two compatibility axes must be verified before any code is written: Composer resolution (illuminate/*, collective/html, orchestra/support floors) and markup compatibility with the target admin theme. The first is binary — pass or no-go. The second is a cost, quantified in CSS overrides. Put the package behind an internal adapter (FieldFactory, or a small Blade component that calls the builder) so the implementation is swappable and no Orchestra\Html type hints leak into domain code; that adapter is what makes the exit plan a one-file change instead of a codebase-wide find-and-replace.

Sequencing.

  1. Audit — composer show orchestra/html, confirm container bindings, record illuminate/* constraints, license, and transitive footprint.
  2. Gate — time-boxed spike in one non-critical admin module. One rendered form end-to-end is the go/no-go signal: _token present exactly once, labels and inputs placed correctly, old-input repopulation works after a failed validation redirect.
  3. Harden — adapter/facade in place, macro prefix convention documented, escaping policy written down ({!! !!} for builder output; raw() requires review).
  4. Expand — apply to subsequent internal CRUD only after the spike passes, with a rendered-output test shipped alongside each new form.
  5. Exit plan documented before the fifth form, not after. If Composer resolution fails at step 1, default to native Blade components or Laravel Collective and stop.

Operational Impact

Maintenance. This is an owned cost, not a vendor-handled one. The v6.1.0 release consists of a single change — bumping the minimum orchestra/support version — which is a weak signal about upstream investment. Budget an internal owner for upgrades, escape/XSS verification, and eventual replacement. Mitigate dependency drift by pinning exact versions in a committed composer.lock with a documented upgrade procedure; because the release cadence is thin, an accidental transitive Orchestra minor bump is more likely to surprise us than a deliberate upstream breaking change.

Support. No meaningful community support base: 0 dependents, negligible stars, thin release cadence. Escalation is internal — the team that adopts it becomes the support desk. The mitigations are structural, not procedural: small surface area, an adapter layer, and no type hints into domain code. Anything that would require extending Orchestra\Html\FormBuilder is a signal we have coupled too far; add an adapter instead.

Scaling. Scaling dimensions are modest. Request-time cost is negligible — this is string composition. The real scaling concern is surface scaling: each additional form that adopts the builder without the adapter widens the eventual replacement blast radius. Keep the adoption perimeter at internal admin CRUD and the replacement stays a bounded, plannable project rather than a migration.

Failure modes. Ranked by operational pain:

  • 419s from duplicate _token — caused by Form::open() nested inside Form::model(), or a partial reopening a form. Mitigation: assert substr_count($content, 'name="_token"') === 1 in at least one test per form family.
  • Cross-form model state bleed — an unclosed Form::model() (easy via @include mid-form) pre-populates the next form on the page. Symptom is mystifying prefilled fields; cause is a missing Form::close().
  • Invisible validation state — control() does not reliably wire has-error/is-invalid. Forms ship looking fine and give users no error feedback on failed submission. Catch this by rendering a failing submission during the spike, not after launch.
  • Double-escaping — {{ Form::control(...) }} renders literal angle brackets. Cheap to diagnose (dd(Form::control(...)) shows the pre-Blade string), cheap to prevent with code review.
  • Macro-not-defined in one environment — service provider ordering in config/app.php / bootstrap/providers.php. Anything assuming macros exist at config time will fail.
  • Asset publishing 404s — staging-only style/script 404s usually trace to a skipped vendor:publish, not the browser cache.
  • Facade resolution to the wrong builder — the first thing to check whenever behaviour looks off: get_class(app('form')).

Ramp-up. Low. The API is commodity Laravel Collective; any developer with Laravel form experience is productive within a single ticket once three conventions are documented: builder output is echoed raw, Form::model() for every edit screen, and macros are prefixed and registered in boot(). The residual ramp-up cost is organizational rather than technical — teams must internalize that this is an internal-admin convenience tool with a written exit plan, not a platform standard. That expectation-setting is the TPM's main deliverable here; the code is the easy part.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
novasa/laravel-language-center
opencage/geocode
adolfoholzer/parameters
livenetworks/ln-starter
shitoudev/permissionmanager
johannesclimacus/laravel-tui
hocvt/seotools
vitalybaev/sypexgeo
amphibee/themosis-ignition
gito-me/fast-excel
frankyso/laravel-ipaymu
geolize-studio/laravel-chile
boomerangui/chat
cgv/localized-resource
noith/settings
kda/laravel-package
kda/filament-dynamic-navigation
bypersoft/signbox
pairus/product-data
fayne/laravel-filament-cms-core