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 .