منشئ النماذج لـ Laravel 5 مستوحى من منشئ النماذج في Symfony. بمساعدة Laravels FormBuilder، تنشئ فئة 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
]
والواجهة (أيضًا في config/app.php
)
' aliases ' => [
// ...
' FormBuilder ' => Kris LaravelFormBuilder Facades FormBuilder::class
]
ملاحظة : ستضيف هذه الحزمة حزمة laravelcollective/html
وتحميل الأسماء المستعارة (Form، 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