Laravel Form builder is forked from kristijanhusak/laravel-form-builder.
composer require balajidharma/laravel-form-builder
Or manually by modifying composer.json
file:
{
"require": {
"balajidharma/laravel-form-builder": "1.*"
}
}
And run composer install
The "Basic Laravel Admin Penel" starter kit come with Laravel Form Builder
Creating form classes is easy. With a simple artisan command:
php artisan make:form Forms/SongForm --fields="name:text, lyrics:textarea, publish:checkbox"
Form is created in path app/Forms/SongForm.php
with content:
<?php
namespace App\Forms;
use BalajiDharma\LaravelFormBuilder\Form;
use BalajiDharma\LaravelFormBuilder\Field;
class SongForm extends Form
{
public function buildForm()
{
$this
->add('name', Field::TEXT, [
'rules' => 'required|min:5'
])
->add('lyrics', Field::TEXTAREA, [
'rules' => 'max:5000'
])
->add('publish', Field::CHECKBOX);
}
}
If you want to instantiate empty form without any fields, just skip passing --fields
parameter:
php artisan make:form Forms/PostForm
Gives:
<?php
namespace App\Forms;
use BalajiDharma\LaravelFormBuilder\Form;
class PostForm extends Form
{
public function buildForm()
{
// Add fields here...
}
}
After that instantiate the class in the controller and pass it to view:
<?php
namespace App\Http\Controllers;
use Illuminate\Routing\Controller as BaseController;
use BalajiDharma\LaravelFormBuilder\FormBuilder;
class SongsController extends BaseController {
public function create(FormBuilder $formBuilder)
{
$form = $formBuilder->create(\App\Forms\SongForm::class, [
'method' => 'POST',
'url' => route('song.store')
]);
return view('song.create', compact('form'));
}
public function store(FormBuilder $formBuilder)
{
$form = $formBuilder->create(\App\Forms\SongForm::class);
if (!$form->isValid()) {
return redirect()->back()->withErrors($form->getErrors())->withInput();
}
// Do saving and other things...
}
}
Alternative example:
<?php
namespace App\Http\Controllers;
use Illuminate\Routing\Controller as BaseController;
use BalajiDharma\LaravelFormBuilder\FormBuilder;
use App\Forms\SongForm;
class SongsController extends BaseController {
public function create(FormBuilder $formBuilder)
{
$form = $formBuilder->create(SongForm::class, [
'method' => 'POST',
'url' => route('song.store')
]);
return view('song.create', compact('form'));
}
public function store(FormBuilder $formBuilder)
{
$form = $formBuilder->create(SongForm::class);
if (!$form->isValid()) {
return redirect()->back()->withErrors($form->getErrors())->withInput();
}
// Do saving and other things...
}
}
If you want to store a model after a form submit considerating all fields are model properties:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use BalajiDharma\LaravelFormBuilder\FormBuilder;
use App\SongForm;
class SongFormController extends Controller
{
public function store(FormBuilder $formBuilder)
{
$form = $formBuilder->create(\App\Forms\SongForm::class);
$form->redirectIfNotValid();
SongForm::create($form->getFieldValues());
// Do redirecting...
}
You can only save properties you need:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use BalajiDharma\LaravelFormBuilder\FormBuilder;
use App\SongForm;
class SongFormController extends Controller
{
public function store(FormBuilder $formBuilder, Request $request)
{
$form = $formBuilder->create(\App\Forms\SongForm::class);
$form->redirectIfNotValid();
$songForm = new SongForm();
$songForm->fill($request->only(['name', 'artist'])->save();
// Do redirecting...
}
Or you can update any model after form submit:
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use BalajiDharma\LaravelFormBuilder\FormBuilder;
use App\SongForm;
class SongFormController extends Controller
{
public function update(int $id, Request $request)
{
$songForm = SongForm::findOrFail($id);
$form = $this->getForm($songForm);
$form->redirectIfNotValid();
$songForm->update($form->getFieldValues());
// Do redirecting...
}
Create the routes
// app/Http/routes.php
Route::get('songs/create', [
'uses' => 'SongsController@create',
'as' => 'song.create'
]);
Route::post('songs', [
'uses' => 'SongsController@store',
'as' => 'song.store'
]);
Print the form in view with form()
helper function:
<!-- resources/views/song/create.blade.php -->
@extends('app')
@section('content')
{!! form($form) !!}
@endsection
Go to /songs/create
; above code will generate this html:
<form method="POST" action="http://example.dev/songs">
<input name="_token" type="hidden" value="FaHZmwcnaOeaJzVdyp4Ml8B6l1N1DLUDsZmsjRFL">
<div class="form-group">
<label for="name" class="control-label">Name</label>
<input type="text" class="form-control" id="name">
</div>
<div class="form-group">
<label for="lyrics" class="control-label">Lyrics</label>
<textarea name="lyrics" class="form-control" id="lyrics"></textarea>
</div>
<div class="form-group">
<label for="publish" class="control-label">Publish</label>
<input type="checkbox" name="publish" id="publish">
</div>
</form>
Or you can generate forms easier by using simple array
<?php
namespace App\Http\Controllers;
use Illuminate\Routing\Controller as BaseController;
use BalajiDharma\LaravelFormBuilder\FormBuilder;
use BalajiDharma\LaravelFormBuilder\Field;
use App\Forms\SongForm;
class SongsController extends BaseController {
public function create(FormBuilder $formBuilder)
{
$form = $formBuilder->createByArray([
[
'name' => 'name',
'type' => Field::TEXT,
],
[
'name' => 'lyrics',
'type' => Field::TEXTAREA,
],
[
'name' => 'publish',
'type' => Field::CHECKBOX
],
]
,[
'method' => 'POST',
'url' => route('song.store')
]);
return view('song.create', compact('form'));
}
}