x-larastrap::form is one of the most complex (and useful) components in Larastrap. It plays well with x-larastrap::field to provide a powerful tool to organize, populate and handle the forms of your Laravel application.
As all other Containers, forms have an obj parameter which can be populated with an object (eventually: an Eloquent model). This parameter is inherited by all child input fields, which values are then inited with the proper attributes matched by their name.
When obj
is null
, all child inputs are left with their explicit value (if set at all).
@php
$obj = (object) ['id' => 1234, 'name' => 'Foo', 'bio' => 'A very smart guy!', 'email' => 'foo@bar.baz', 'country' => 'it', 'colors' => ['red', 'blue']];
$countries = ['fr' => 'France', 'de' => 'Germany', 'it' => 'Italy'];
@endphp
<x-larastrap::form :obj="$obj">
<x-larastrap::hidden name="id" />
<x-larastrap::number name="id" label="ID" disabled="true" />
<x-larastrap::text name="name" label="Name" />
<x-larastrap::text name="surname" label="Surname" value="Bar" />
<x-larastrap::textarea name="bio" label="Bio" />
<x-larastrap::email name="email" label="EMail" help="Must be a valid email address" />
<x-larastrap::check name="check" label="Check" />
<x-larastrap::select name="country" label="Country (as select)" :options="$countries" />
<x-larastrap::radios name="country" label="Country (as radio)" :options="$countries" color="danger" />
<x-larastrap::checks name="colors" label="Colors" :options="['red' => 'Red', 'green' => 'Green', 'blue' => 'Blue']" color="warning" />
</x-larastrap::form>
<form id="form-3416a75f4cea9109507cacd8e2f2aefc" class="" method="post" name="form-3416a75f4cea9109507cacd8e2f2aefc">
<input type="hidden" name="_token" value="fBA84BFlwbIZzQvExSe0mqW0xNWqHVx9H20AcbMu"> <input id="hidden-ec267c9c6ea0334adc9260b7bfc91c3c" type="hidden" class="" name="id" value="1234">
<div class="row mb-3">
<label for="input-25599770dbec57ac4a7ee7906d7b9f7e" class="col-4 col-form-label">ID</label>
<div class="col-8">
<input id="input-25599770dbec57ac4a7ee7906d7b9f7e" type="number" class="form-control-plaintext" name="id" value="1234" step="1" min="-9223372036854775808" max="9223372036854775807" disabled>
</div>
</div>
<div class="row mb-3">
<label for="input-9712bd5cd2cb1e865930db435281268b" class="col-4 col-form-label">Name</label>
<div class="col-8">
<input id="input-9712bd5cd2cb1e865930db435281268b" type="text" class="form-control" name="name" value="Foo">
</div>
</div>
<div class="row mb-3">
<label for="input-dde6755e6f48d20ccabfcf3e2fca4edb" class="col-4 col-form-label">Surname</label>
<div class="col-8">
<input id="input-dde6755e6f48d20ccabfcf3e2fca4edb" type="text" class="form-control" name="surname" value="Bar">
</div>
</div>
<div class="row mb-3">
<label for="textarea-a52d78d421adfbca00d3f28725bc232e" class="col-4 col-form-label">Bio</label>
<div class="col-8">
<textarea id="textarea-a52d78d421adfbca00d3f28725bc232e" class="form-control" name="bio">A very smart guy!</textarea>
</div>
</div>
<div class="row mb-3">
<label for="input-fc76d0de2f62aca08f0ef41e7ab69ed1" class="col-4 col-form-label">EMail</label>
<div class="col-8">
<input id="input-fc76d0de2f62aca08f0ef41e7ab69ed1" type="email" class="form-control" name="email" value="foo@bar.baz">
<div class="form-text">
Must be a valid email address
</div>
</div>
</div>
<div class="row mb-3">
<label for="check-7dc03d7597d074d898382b1632d1d664" class="col-4 col-form-label">Check</label>
<div class="col-8">
<div class="form-check mt-1">
<input id="check-7dc03d7597d074d898382b1632d1d664" type="checkbox" class="form-check-input" name="check">
</div>
</div>
</div>
<div class="row mb-3">
<label for="select-5810451aecb9fec89a2382b15bd96d71" class="col-4 col-form-label">Country (as select)</label>
<div class="col-8">
<select id="select-5810451aecb9fec89a2382b15bd96d71" class="form-select" name="country">
<option value="fr">
France
</option>
<option value="de">
Germany
</option>
<option value="it" selected>
Italy
</option>
</select>
</div>
</div>
<div class="row mb-3">
<label for="radios-b705c892a1791a0efa78c2171b51faaf" class="col-4 col-form-label">Country (as radio)</label>
<div class="col-8">
<div class="btn-group" role="group">
<input type="radio" class="btn-check" name="country" id="radios-b705c892a1791a0efa78c2171b51faaf-0309a6c666a7a803fdb9db95de71cf01" autocomplete="off" value="fr"> <label class="btn btn-danger" for="radios-b705c892a1791a0efa78c2171b51faaf-0309a6c666a7a803fdb9db95de71cf01">France</label> <input type="radio" class="btn-check" name="country" id="radios-b705c892a1791a0efa78c2171b51faaf-d8b00929dec65d422303256336ada04f" autocomplete="off" value="de"> <label class="btn btn-danger" for="radios-b705c892a1791a0efa78c2171b51faaf-d8b00929dec65d422303256336ada04f">Germany</label> <input type="radio" class="btn-check" name="country" id="radios-b705c892a1791a0efa78c2171b51faaf-1007e1b7f894dfbf72a0eaa80f3bc57e" autocomplete="off" value="it" checked> <label class="btn btn-danger" for="radios-b705c892a1791a0efa78c2171b51faaf-1007e1b7f894dfbf72a0eaa80f3bc57e">Italy</label>
</div>
</div>
</div>
<div class="row mb-3">
<label for="checks-e07b2f184f10a2ed536fdaf141c5bce8" class="col-4 col-form-label">Colors</label>
<div class="col-8">
<div class="btn-group" role="group">
<input type="checkbox" class="btn-check" name="colors[]" id="checks-e07b2f184f10a2ed536fdaf141c5bce8-ee38e4d5dd68c4e440825018d549cb47" autocomplete="off" value="red" checked> <label class="btn btn-warning" for="checks-e07b2f184f10a2ed536fdaf141c5bce8-ee38e4d5dd68c4e440825018d549cb47">Red</label> <input type="checkbox" class="btn-check" name="colors[]" id="checks-e07b2f184f10a2ed536fdaf141c5bce8-d382816a3cbeed082c9e216e7392eed1" autocomplete="off" value="green"> <label class="btn btn-warning" for="checks-e07b2f184f10a2ed536fdaf141c5bce8-d382816a3cbeed082c9e216e7392eed1">Green</label> <input type="checkbox" class="btn-check" name="colors[]" id="checks-e07b2f184f10a2ed536fdaf141c5bce8-9594eec95be70e7b1710f730fdda33d9" autocomplete="off" value="blue" checked> <label class="btn btn-warning" for="checks-e07b2f184f10a2ed536fdaf141c5bce8-9594eec95be70e7b1710f730fdda33d9">Blue</label>
</div>
</div>
</div>
<div class="col-12 text-end">
<button id="button-7e630c826512b2ca1f94dfda1d8d9af0" class="btn btn-primary" type="submit">Save</button>
</div>
</form>
action
and method
parameters are equivalent to the classic HTML attributes for forms. But you can specify once a default method
in your configuration file (by default it is POST
).
Any method
different than POST
or GET
translates to @method('XYZ')
, as supported by Laravel.
<x-larastrap::form method="DELETE" :buttons="[['label' => 'Delete!', 'color' => 'danger', 'type' => 'submit']]">
<div class="alert alert-danger">This is a delete form!</div>
</x-larastrap::form>
<form id="form-9778d5d219c5080b9a6a17bef029331c" class="" method="post" name="form-9778d5d219c5080b9a6a17bef029331c">
<input type="hidden" name="_token" value="fBA84BFlwbIZzQvExSe0mqW0xNWqHVx9H20AcbMu"> <input type="hidden" name="_method" value="DELETE">
<div class="alert alert-danger">
This is a delete form!
</div>
<div class="col-12 text-end">
<button id="button-5ea7e8d4543eb62aefcf8f9051b64fe9" class="btn btn-danger">Delete!</button>
</div>
</form>
A bit more articulated is baseaction : this is intended to be the prefix of a Laravel's Resource Controller.
In the following example, when obj
is set to NULL
it is assigned as action
the value route('user.store')
; otherwise, if obj
is a valid object, it will become route('user.update', $obj->id)
. This is handy to have a single edit form to both create and update the same kind of model.
Of course, when in update mode, the proper PUT
method
is used.
<x-larastrap::form :obj="null" baseaction="user">
<div class="alert alert-info">
This form creates a new model.
</div>
<x-larastrap::text name="name" label="Name" />
<x-larastrap::email name="email" label="EMail" />
</x-larastrap::form>
<br>
@php
$obj = (object) [
'id' => 123,
'name' => 'Foo Bar',
'email' => 'foobar@example.com',
];
@endphp
<x-larastrap::form :obj="$obj" baseaction="user">
<div class="alert alert-info">
This form updates the existing model.
</div>
<x-larastrap::text name="name" label="Name" />
<x-larastrap::email name="email" label="EMail" />
</x-larastrap::form>
<form id="form-2723d092b63885e0d7c260cc007e8b9d" class="" method="post" action="https://larastrap.madbob.org/user" name="form-2723d092b63885e0d7c260cc007e8b9d">
<input type="hidden" name="_token" value="fBA84BFlwbIZzQvExSe0mqW0xNWqHVx9H20AcbMu">
<div class="alert alert-info">
This form creates a new model.
</div>
<div class="row mb-3">
<label for="input-5da944f7bf7de085c3e56c349da5c28a" class="col-4 col-form-label">Name</label>
<div class="col-8">
<input id="input-5da944f7bf7de085c3e56c349da5c28a" type="text" class="form-control" name="name" value="">
</div>
</div>
<div class="row mb-3">
<label for="input-d8d4ee5d62e1385d17e3eb76bde6ec85" class="col-4 col-form-label">EMail</label>
<div class="col-8">
<input id="input-d8d4ee5d62e1385d17e3eb76bde6ec85" type="email" class="form-control" name="email" value="">
</div>
</div>
<div class="col-12 text-end">
<button id="button-0d663fdf4a6ae35e0bd021e5685dc225" class="btn btn-primary" type="submit">Save</button>
</div>
</form><br>
<form id="form-eb160de1de89d9058fcb0b968dbbbd68" class="" method="post" action="https://larastrap.madbob.org/user/123" name="form-eb160de1de89d9058fcb0b968dbbbd68">
<input type="hidden" name="_token" value="fBA84BFlwbIZzQvExSe0mqW0xNWqHVx9H20AcbMu"> <input type="hidden" name="_method" value="PUT">
<div class="alert alert-info">
This form updates the existing model.
</div>
<div class="row mb-3">
<label for="input-219118a8ca068a60f8767588c3de96a4" class="col-4 col-form-label">Name</label>
<div class="col-8">
<input id="input-219118a8ca068a60f8767588c3de96a4" type="text" class="form-control" name="name" value="Foo Bar">
</div>
</div>
<div class="row mb-3">
<label for="input-92364b49dcc3f86e1800de5676cb2103" class="col-4 col-form-label">EMail</label>
<div class="col-8">
<input id="input-92364b49dcc3f86e1800de5676cb2103" type="email" class="form-control" name="email" value="foobar@example.com">
</div>
</div>
<div class="col-12 text-end">
<button id="button-e7ab1d2fbfd55e239c5d3fe1b894d877" class="btn btn-primary" type="submit">Save</button>
</div>
</form>
The form's buttons (notably: the submit button) are generally not included within the x-larastrap::form node but are defined using the buttons parameter, which has to be an array of arrays, each rappresenting a button and with the parameters for the relevant x-larastrap::button.
<x-larastrap::form :buttons="[['color' => 'success', 'label' => 'Submit', 'attributes' => ['type' => 'submit']], ['color' => 'danger', 'label' => 'Reset', 'attributes' => ['type' => 'reset']]]">
<x-larastrap::text name="firstname" label="First Name" />
<x-larastrap::text name="lastname" label="Last Name" />
<x-larastrap::email name="email" label="EMail" />
</x-larastrap::form>
<form id="form-1385974ed5904a438616ff7bdb3f7439" class="" method="post" name="form-1385974ed5904a438616ff7bdb3f7439">
<input type="hidden" name="_token" value="fBA84BFlwbIZzQvExSe0mqW0xNWqHVx9H20AcbMu">
<div class="row mb-3">
<label for="input-290fdbe0b581643d916af5754e26e5fa" class="col-4 col-form-label">First Name</label>
<div class="col-8">
<input id="input-290fdbe0b581643d916af5754e26e5fa" type="text" class="form-control" name="firstname" value="">
</div>
</div>
<div class="row mb-3">
<label for="input-782ac11d90977058b862b0de7e79f48a" class="col-4 col-form-label">Last Name</label>
<div class="col-8">
<input id="input-782ac11d90977058b862b0de7e79f48a" type="text" class="form-control" name="lastname" value="">
</div>
</div>
<div class="row mb-3">
<label for="input-139e8d9448b6d38a97bb1904de5364b6" class="col-4 col-form-label">EMail</label>
<div class="col-8">
<input id="input-139e8d9448b6d38a97bb1904de5364b6" type="email" class="form-control" name="email" value="">
</div>
</div>
<div class="col-12 text-end">
<button id="button-3512e675531150bbc02416008fb74142" class="btn btn-success" type="submit">Submit</button> <button id="button-d3180499f77b2a22b807225cb8e694ae" class="btn btn-danger" type="reset">Reset</button>
</div>
</form>
A peculiar parameter which can be used for those buttons is element
, that permits to use a different node type for the element. By default it is of course larastrap::button
, but can be any other Blade's Component identifier (remember to prefix Larastrap's widgets with larastrap::
).
@php
$buttons = [
['element' => 'larastrap::link', 'label' => 'This is a Link', 'href' => 'https://larastrap.madbob.org/'],
['color' => 'success', 'label' => 'Submit', 'attributes' => ['type' => 'submit']]
];
@endphp
<x-larastrap::form :buttons="$buttons">
<x-larastrap::text name="firstname" label="First Name" />
<x-larastrap::text name="lastname" label="Last Name" />
<x-larastrap::email name="email" label="EMail" />
</x-larastrap::form>
<form id="form-5878a7ab84fb43402106c575658472fa" class="" method="post" name="form-5878a7ab84fb43402106c575658472fa">
<input type="hidden" name="_token" value="fBA84BFlwbIZzQvExSe0mqW0xNWqHVx9H20AcbMu">
<div class="row mb-3">
<label for="input-7a453ca31734520ad253567305d7c1d1" class="col-4 col-form-label">First Name</label>
<div class="col-8">
<input id="input-7a453ca31734520ad253567305d7c1d1" type="text" class="form-control" name="firstname" value="">
</div>
</div>
<div class="row mb-3">
<label for="input-984665160824a0aaac97d1328b264ded" class="col-4 col-form-label">Last Name</label>
<div class="col-8">
<input id="input-984665160824a0aaac97d1328b264ded" type="text" class="form-control" name="lastname" value="">
</div>
</div>
<div class="row mb-3">
<label for="input-cbb8e4f206fd45d14fbead4fdd0cce30" class="col-4 col-form-label">EMail</label>
<div class="col-8">
<input id="input-cbb8e4f206fd45d14fbead4fdd0cce30" type="email" class="form-control" name="email" value="">
</div>
</div>
<div class="col-12 text-end">
<a id="link-82658e4271685d70826195d45bd9d25a" class="btn btn-primary" href="https://larastrap.madbob.org/">This is a Link</a> <button id="button-affedf7940ee69dba11e1047ababa4c9" class="btn btn-success" type="submit">Submit</button>
</div>
</form>
Leveraging the Typography widget, you are actually able to append in the Form's footer any kind of text. Even better: any kind of text generated from the contextual obj .
@php
$user = App\Models\User::inRandomOrder()->first();
$buttons = [
['element' => 'larastrap::t', 'node' => 'small', 'name' => 'updated_at', 'prelabel' => 'Last update: ', 'classes' => ['float-start']],
['color' => 'success', 'label' => 'Submit', 'attributes' => ['type' => 'submit']]
];
@endphp
<x-larastrap::form :buttons="$buttons" :obj="$user">
<x-larastrap::text name="name" label="Name" />
<x-larastrap::email name="email" label="EMail" />
<hr>
</x-larastrap::form>
<form id="form-a2557a7b2e94197ff767970b67041697" class="" method="post" name="form-a2557a7b2e94197ff767970b67041697">
<input type="hidden" name="_token" value="fBA84BFlwbIZzQvExSe0mqW0xNWqHVx9H20AcbMu">
<div class="row mb-3">
<label for="input-cba96072aa5f4431627f52019f7b9fe3" class="col-4 col-form-label">Name</label>
<div class="col-8">
<input id="input-cba96072aa5f4431627f52019f7b9fe3" type="text" class="form-control" name="name" value="Mr. Cyril Adams">
</div>
</div>
<div class="row mb-3">
<label for="input-261a70e82b097f7c392372d061d87241" class="col-4 col-form-label">EMail</label>
<div class="col-8">
<input id="input-261a70e82b097f7c392372d061d87241" type="email" class="form-control" name="email" value="henri86@example.net">
</div>
</div>
<hr>
<div class="col-12 text-end">
<small id="basenode-e07639b3418319ffc1b1de11fbf6e7f4" class="float-start">Last update: 2023-05-07 00:15:11</small> <button id="button-8a5c5fd687ce96e21f1e0d7cb71784ff" class="btn btn-success" type="submit">Submit</button>
</div>
</form>
The buttons_align
parameter permit to define where to put buttons
within the form: by default their are aligned to end
, but can also be at start
or center
.
<x-larastrap::form formview="vertical" buttons_align="start">
<x-larastrap::text name="firstname" label="First Name" />
<x-larastrap::text name="lastname" label="Last Name" />
<x-larastrap::email name="email" label="EMail" />
</x-larastrap::form>
<form id="form-3b8a614226a953a8cd9526fca6fe9ba5" class="" method="post" name="form-3b8a614226a953a8cd9526fca6fe9ba5">
<input type="hidden" name="_token" value="fBA84BFlwbIZzQvExSe0mqW0xNWqHVx9H20AcbMu">
<div class="mb-3">
<label for="input-b378979f17badebd64df590b22258583" class="form-label">First Name</label> <input id="input-b378979f17badebd64df590b22258583" type="text" class="form-control" name="firstname" value="">
</div>
<div class="mb-3">
<label for="input-8798601a95bd703a4eab9520cabde20c" class="form-label">Last Name</label> <input id="input-8798601a95bd703a4eab9520cabde20c" type="text" class="form-control" name="lastname" value="">
</div>
<div class="mb-3">
<label for="input-9d6598fc7011b384f210effe3b439c67" class="form-label">EMail</label> <input id="input-9d6598fc7011b384f210effe3b439c67" type="email" class="form-control" name="email" value="">
</div>
<div class="col-12 text-start">
<button id="button-8db68352f3a7c263e4e49dcc138192c6" class="btn btn-primary" type="submit">Save</button>
</div>
</form>
It is possible to organize the layout of the Form in multiple ways, using the formview
parameter. horizontal
is the default value and behavior, but it is possible to opt for inline
; it this case, please note that labels are converted in placeholders to accomodate into the row.
<x-larastrap::form formview="inline">
<x-larastrap::text name="firstname" label="First Name" />
<x-larastrap::text name="lastname" label="Last Name" />
</x-larastrap::form>
<form id="form-01161aaa0b6d1345dd8fe4e481144d84" class="row row-cols-lg-auto g-3 align-items-center" method="post" name="form-01161aaa0b6d1345dd8fe4e481144d84">
<input type="hidden" name="_token" value="fBA84BFlwbIZzQvExSe0mqW0xNWqHVx9H20AcbMu">
<div class="col-auto">
<input id="input-179614d8133d71d2b2066fea838ac16f" type="text" class="form-control" name="firstname" value="" placeholder="First Name">
</div>
<div class="col-auto">
<input id="input-b8365874cd3fddbba416df0db12a9ffc" type="text" class="form-control" name="lastname" value="" placeholder="Last Name">
</div>
<div class="col-12 text-end">
<button id="button-04ce9d705dfe0cb85ce41b52a6f16ea9" class="btn btn-primary" type="submit">Save</button>
</div>
</form>
Another option is the vertical
value for formview
.
<x-larastrap::form formview="vertical">
<x-larastrap::text name="firstname" label="First Name" />
<x-larastrap::text name="lastname" label="Last Name" />
<x-larastrap::email name="email" label="EMail" />
<x-larastrap::check name="check" label="Check" inline />
<x-larastrap::checks name="checks" label="Checks" :options="['One', 'Two', 'Three']" />
</x-larastrap::form>
<form id="form-36660e59856b4de58a219bcf4e27eba3" class="" method="post" name="form-36660e59856b4de58a219bcf4e27eba3">
<input type="hidden" name="_token" value="fBA84BFlwbIZzQvExSe0mqW0xNWqHVx9H20AcbMu">
<div class="mb-3">
<label for="input-5d0a151e5b29ba563c529cf3ba74e2a6" class="form-label">First Name</label> <input id="input-5d0a151e5b29ba563c529cf3ba74e2a6" type="text" class="form-control" name="firstname" value="">
</div>
<div class="mb-3">
<label for="input-1b227a510e4eeec3f9d24f24501911e7" class="form-label">Last Name</label> <input id="input-1b227a510e4eeec3f9d24f24501911e7" type="text" class="form-control" name="lastname" value="">
</div>
<div class="mb-3">
<label for="input-04f99994473498cccc88565ab2d3e465" class="form-label">EMail</label> <input id="input-04f99994473498cccc88565ab2d3e465" type="email" class="form-control" name="email" value="">
</div>
<div class="mb-3">
<div class="form-check mt-1">
<input id="check-3a3ca44d19da4f1d296192b3db5e505e" type="checkbox" class="form-check-input" name="check"> <label for="check-3a3ca44d19da4f1d296192b3db5e505e" class="">Check</label>
</div>
</div>
<div class="mb-3">
<label for="checks-cc1783ae7d6dec87f2913f308aba3a66" class="form-label">Checks</label>
<div class="d-block btn-group" role="group">
<input type="checkbox" class="btn-check" name="checks[]" id="checks-cc1783ae7d6dec87f2913f308aba3a66-06c2cea18679d64399783748fa367bdd" autocomplete="off" value="0"> <label class="btn btn-outline-primary" for="checks-cc1783ae7d6dec87f2913f308aba3a66-06c2cea18679d64399783748fa367bdd">One</label> <input type="checkbox" class="btn-check" name="checks[]" id="checks-cc1783ae7d6dec87f2913f308aba3a66-aada29daee1d64ed0fe907043855cb7e" autocomplete="off" value="1"> <label class="btn btn-outline-primary" for="checks-cc1783ae7d6dec87f2913f308aba3a66-aada29daee1d64ed0fe907043855cb7e">Two</label> <input type="checkbox" class="btn-check" name="checks[]" id="checks-cc1783ae7d6dec87f2913f308aba3a66-ca8a2087e5557e317599344687a57391" autocomplete="off" value="2"> <label class="btn btn-outline-primary" for="checks-cc1783ae7d6dec87f2913f308aba3a66-ca8a2087e5557e317599344687a57391">Three</label>
</div>
</div>
<div class="col-12 text-end">
<button id="button-0beada9e83ebbbc6d804cf2ced31c767" class="btn btn-primary" type="submit">Save</button>
</div>
</form>
Larastrap's forms have built-in integration with Laravel's Validation and Bootstrap's Validation, and a few parameters to deal with it.
By default error_handling
is set to true
and error_bag
is set to default
. When validation fails, and the error bag is populated, fields involved in the form but considered as valid are pre-populated with the previously submitted values through the proper Laravel helpers.
false
. To change the name of the "error bag" used by your server-side Laravel's validator, set error_bag
accordingly.
@php
// Server side validation for this form is defined as:
//
// $request->validateWithBag('special', [
// 'email' => 'required|email|max:255',
// 'name' => 'required',
// 'select' => 'required',
// 'check' => 'accepted',
// 'checks' => 'required',
// 'radios' => 'required',
// ]);
@endphp
<x-larastrap::form action="/validated" error_bag="special">
<x-larastrap::text name="name" label="Name" />
<x-larastrap::email name="email" label="EMail" />
<x-larastrap::select name="select" label="Select" :options="['' => 'Choose One', 'First', 'Second']" />
<x-larastrap::check name="check" label="Check" />
<x-larastrap::checks name="checks" label="Checks" :options="['One', 'Two', 'Three']" />
<x-larastrap::radios name="radios" label="Radio" :options="['One', 'Two', 'Three']" />
</x-larastrap::form>
<form id="form-2d106fdd52e81421f3c118371f0950d8" class="" method="post" action="/validated" name="form-2d106fdd52e81421f3c118371f0950d8">
<input type="hidden" name="_token" value="fBA84BFlwbIZzQvExSe0mqW0xNWqHVx9H20AcbMu">
<div class="row mb-3">
<label for="input-1b631709298459b0a7291734211aee8c" class="col-4 col-form-label">Name</label>
<div class="col-8">
<input id="input-1b631709298459b0a7291734211aee8c" type="text" class="form-control" name="name" value="">
</div>
</div>
<div class="row mb-3">
<label for="input-3dc56523fdd6abdeff7414b724d46f6e" class="col-4 col-form-label">EMail</label>
<div class="col-8">
<input id="input-3dc56523fdd6abdeff7414b724d46f6e" type="email" class="form-control" name="email" value="">
</div>
</div>
<div class="row mb-3">
<label for="select-73f0992a4d9e69ed3e67cfebc6a2ee03" class="col-4 col-form-label">Select</label>
<div class="col-8">
<select id="select-73f0992a4d9e69ed3e67cfebc6a2ee03" class="form-select" name="select">
<option value="" selected>
Choose One
</option>
<option value="0">
First
</option>
<option value="1">
Second
</option>
</select>
</div>
</div>
<div class="row mb-3">
<label for="check-f8871c296f7b3a218b0c5cd117ce9c43" class="col-4 col-form-label">Check</label>
<div class="col-8">
<div class="form-check mt-1">
<input id="check-f8871c296f7b3a218b0c5cd117ce9c43" type="checkbox" class="form-check-input" name="check">
</div>
</div>
</div>
<div class="row mb-3">
<label for="checks-55dffc0b85853e593dd3749b0c0078da" class="col-4 col-form-label">Checks</label>
<div class="col-8">
<div class="btn-group" role="group">
<input type="checkbox" class="btn-check" name="checks[]" id="checks-55dffc0b85853e593dd3749b0c0078da-06c2cea18679d64399783748fa367bdd" autocomplete="off" value="0"> <label class="btn btn-outline-primary" for="checks-55dffc0b85853e593dd3749b0c0078da-06c2cea18679d64399783748fa367bdd">One</label> <input type="checkbox" class="btn-check" name="checks[]" id="checks-55dffc0b85853e593dd3749b0c0078da-aada29daee1d64ed0fe907043855cb7e" autocomplete="off" value="1"> <label class="btn btn-outline-primary" for="checks-55dffc0b85853e593dd3749b0c0078da-aada29daee1d64ed0fe907043855cb7e">Two</label> <input type="checkbox" class="btn-check" name="checks[]" id="checks-55dffc0b85853e593dd3749b0c0078da-ca8a2087e5557e317599344687a57391" autocomplete="off" value="2"> <label class="btn btn-outline-primary" for="checks-55dffc0b85853e593dd3749b0c0078da-ca8a2087e5557e317599344687a57391">Three</label>
</div>
</div>
</div>
<div class="row mb-3">
<label for="radios-d80a3f9a9ce403afe7b8d0baffc3752b" class="col-4 col-form-label">Radio</label>
<div class="col-8">
<div class="btn-group" role="group">
<input type="radio" class="btn-check" name="radios" id="radios-d80a3f9a9ce403afe7b8d0baffc3752b-06c2cea18679d64399783748fa367bdd" autocomplete="off" value="0"> <label class="btn btn-outline-primary" for="radios-d80a3f9a9ce403afe7b8d0baffc3752b-06c2cea18679d64399783748fa367bdd">One</label> <input type="radio" class="btn-check" name="radios" id="radios-d80a3f9a9ce403afe7b8d0baffc3752b-aada29daee1d64ed0fe907043855cb7e" autocomplete="off" value="1"> <label class="btn btn-outline-primary" for="radios-d80a3f9a9ce403afe7b8d0baffc3752b-aada29daee1d64ed0fe907043855cb7e">Two</label> <input type="radio" class="btn-check" name="radios" id="radios-d80a3f9a9ce403afe7b8d0baffc3752b-ca8a2087e5557e317599344687a57391" autocomplete="off" value="2"> <label class="btn btn-outline-primary" for="radios-d80a3f9a9ce403afe7b8d0baffc3752b-ca8a2087e5557e317599344687a57391">Three</label>
</div>
</div>
</div>
<div class="col-12 text-end">
<button id="button-7ca1f045ef586ef4a33ac7003363180b" class="btn btn-primary" type="submit">Save</button>
</div>
</form>
To, indeed, leverage Bootstrap's client-side validation functionality, use the client_side_errors parameter to deploy the relevant attributes in the HTML markup (and do not forget to init the proper Javascript code).
<x-larastrap::form id="native-validated" client_side_errors="true">
<x-larastrap::text name="name" label="Name" required />
<x-larastrap::email name="email" label="EMail" required />
</x-larastrap::form>
<script>
(() => {
let form = document.getElementById('native-validated');
form.addEventListener('submit', event => {
if (!form.checkValidity()) {
event.preventDefault()
event.stopPropagation()
}
form.classList.add('was-validated')
}, false);
})();
</script>
<form id="native-validated" class="needs-validation" method="post" novalidate="1" name="native-validated">
<input type="hidden" name="_token" value="fBA84BFlwbIZzQvExSe0mqW0xNWqHVx9H20AcbMu">
<div class="row mb-3" novalidate="1">
<label for="input-ea5abd9319ff517d6f4af0694db39d47" class="col-4 col-form-label">Name</label>
<div class="col-8">
<input id="input-ea5abd9319ff517d6f4af0694db39d47" type="text" class="form-control" name="name" value="" required="" novalidate="1">
</div>
</div>
<div class="row mb-3" novalidate="1">
<label for="input-8217d73114ef9e0c129bfaa908a72ca1" class="col-4 col-form-label">EMail</label>
<div class="col-8">
<input id="input-8217d73114ef9e0c129bfaa908a72ca1" type="email" class="form-control" name="email" value="" required="" novalidate="1">
</div>
</div>
<div class="col-12 text-end">
<button id="button-023e9cb85ed15afad58d28fd48f9f38a" class="btn btn-primary" novalidate="1" type="submit">Save</button>
</div>
</form>
<script>
(() => {
let form = document.getElementById('native-validated');
form.addEventListener('submit', event => {
if (!form.checkValidity()) {
event.preventDefault()
event.stopPropagation()
}
form.classList.add('was-validated')
}, false);
})();
</script>