mediactive-digital / laravel-form-builder
Laravel form builder - symfony like
Requires
- php: >=7.4
- illuminate/database: ^6 || ^7 || ^8 || ^9 || ^10
- illuminate/validation: ^6 || ^7 || ^8 || ^9 || ^10
- laravelcollective/html: ^6
Requires (Dev)
- orchestra/testbench: ^6.13 || ^7.0 || ^8
This package is auto-updated.
Last update: 2024-11-12 14:38:48 UTC
README
Laravel 5 form builder
Form builder for Laravel 5 inspired by Symfony's form builder. With help of Laravels FormBuilder class creates forms that can be easy modified and reused. By default it supports Bootstrap 3.
Laravel 4
For Laravel 4 version check laravel4-form-builder.
Bootstrap 4 support
To use bootstrap 4 instead of bootstrap 3, install laravel-form-builder-bs4.
Upgrade to 1.6
If you upgraded to >1.6.*
from 1.5.*
or earlier, and having problems with form value binding, rename default_value
to value
.
More info in changelog.
Documentation
For detailed documentation refer to https://kristijanhusak.github.io/laravel-form-builder/.
Changelog
Changelog can be found here.
Installation
Using Composer
composer require kris/laravel-form-builder
Or manually by modifying composer.json
file:
{ "require": { "kris/laravel-form-builder": "1.*" } }
And run composer install
Then add Service provider to config/app.php
'providers' => [ // ... Kris\LaravelFormBuilder\FormBuilderServiceProvider::class ]
And Facade (also in config/app.php
)
'aliases' => [ // ... 'FormBuilder' => Kris\LaravelFormBuilder\Facades\FormBuilder::class ]
Notice: This package will add laravelcollective/html
package and load aliases (Form, Html) if they do not exist in the IoC container.
Quick start
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 Kris\LaravelFormBuilder\Form; use Kris\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 Kris\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 Kris\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 Kris\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 Kris\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 Kris\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 Kris\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 Kris\LaravelFormBuilder\FormBuilder; use Kris\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')); } }
Contributing
Project follows PSR-2 standard and it's covered with PHPUnit tests. Pull requests should include tests and pass Travis CI build.
To run tests first install dependencies with composer install
.
After that tests can be run with vendor/bin/phpunit