เครื่องมือสร้างฟอร์มสำหรับ Laravel 5 ที่ได้รับแรงบันดาลใจจากเครื่องมือสร้างฟอร์มของ Symfony ด้วยความช่วยเหลือของคลาส Laravels FormBuilder จะสร้างแบบฟอร์มที่สามารถแก้ไขและนำกลับมาใช้ใหม่ได้ง่าย โดยค่าเริ่มต้นจะรองรับ Bootstrap 3
สำหรับเวอร์ชัน Laravel 4 ให้ตรวจสอบ laravel4-form-builder
หากต้องการใช้ bootstrap 4 แทน bootstrap 3 ให้ติดตั้ง laravel-form-builder-bs4
หากคุณอัพเกรดเป็น >1.6.*
จาก 1.5.*
หรือเก่ากว่า และมีปัญหากับการเชื่อมโยงค่าแบบฟอร์ม ให้เปลี่ยนชื่อ default_value
เป็น value
ข้อมูลเพิ่มเติมในบันทึกการเปลี่ยนแปลง
สำหรับเอกสารโดยละเอียด โปรดดูที่ https://kristijanhusak.github.io/laravel-form-builder/
สามารถดูบันทึกการเปลี่ยนแปลงได้ที่นี่
composer require kris/laravel-form-builder
หรือด้วยตนเองโดยการแก้ไขไฟล์ composer.json
:
{
"require" : {
"kris/laravel-form-builder" : " 1.* "
}
}
และเรียกใช้ composer install
จากนั้นเพิ่มผู้ให้บริการไปที่ config/app.php
' providers ' => [
// ...
Kris LaravelFormBuilder FormBuilderServiceProvider::class
]
และ Facade (เช่นใน config/app.php
)
' aliases ' => [
// ...
' FormBuilder ' => Kris LaravelFormBuilder Facades FormBuilder::class
]
หมายเหตุ : แพ็คเกจนี้จะเพิ่มแพ็คเกจ laravelcollective/html
และโหลดนามแฝง (แบบฟอร์ม, Html) หากไม่มีอยู่ในคอนเทนเนอร์ IoC
การสร้างคลาสแบบฟอร์มเป็นเรื่องง่าย ด้วยคำสั่งช่างฝีมือง่ายๆ:
php artisan make:form Forms/SongForm --fields= " name:text, lyrics:textarea, publish:checkbox "
แบบฟอร์มถูกสร้างขึ้นในเส้นทาง app/Forms/SongForm.php
โดยมีเนื้อหา:
<?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 );
}
}
หากคุณต้องการสร้างอินสแตนซ์ของฟอร์มว่างโดยไม่มีฟิลด์ใดๆ เพียงข้ามการส่งพารามิเตอร์ --fields
:
php artisan make:form Forms/PostForm
ให้:
<?php
namespace App Forms ;
use Kris LaravelFormBuilder Form ;
class PostForm extends Form
{
public function buildForm ()
{
// Add fields here...
}
}
หลังจากนั้นให้ยกตัวอย่างคลาสในคอนโทรลเลอร์แล้วส่งต่อให้ดู:
<?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...
}
}
ตัวอย่างทางเลือก:
<?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...
}
}
หากคุณต้องการจัดเก็บโมเดลหลังจากส่งแบบฟอร์มโดยพิจารณาว่าฟิลด์ทั้งหมดเป็นคุณสมบัติของโมเดล:
<?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...
}
คุณสามารถบันทึกคุณสมบัติที่คุณต้องการได้เท่านั้น:
<?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...
}
หรือคุณสามารถอัปเดตโมเดลใดก็ได้หลังจากส่งแบบฟอร์ม:
<?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...
}
สร้างเส้นทาง
// app/Http/routes.php
Route:: get ( ' songs/create ' , [
' uses ' => ' SongsController@create ' ,
' as ' => ' song.create '
]);
Route:: post ( ' songs ' , [
' uses ' => ' SongsController@store ' ,
' as ' => ' song.store '
]);
พิมพ์แบบฟอร์มในมุมมองด้วยฟังก์ชันตัวช่วย form()
:
<!-- resources/views/song/create.blade.php -->
@extends('app')
@section('content')
{!! form($form) !!}
@endsection
ไปที่ /songs/create
; โค้ดด้านบนจะสร้าง 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 >
หรือคุณสามารถสร้างแบบฟอร์มได้ง่ายขึ้นโดยใช้อาร์เรย์แบบง่าย
<?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 ' ));
}
}
โปรเจ็กต์เป็นไปตามมาตรฐาน PSR-2 และครอบคลุมด้วยการทดสอบ PHPUnit คำขอดึงควรรวมการทดสอบและผ่านการสร้าง Travis CI
หากต้องการรันการทดสอบก่อนอื่น ให้ติดตั้งการพึ่งพาด้วย composer install
หลังจากนั้นการทดสอบสามารถรันกับ vendor/bin/phpunit
ได้