Tóm Tắt
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