balajidharma / laravel-form-builder
Laravel 表单构建器
v1.0.3
2024-09-23 23:13 UTC
Requires
- illuminate/support: ^10.0|^11.0
README
为您的 Laravel 项目添加表单构建器。
Laravel 表单构建器
Laravel 表单构建器是从 kristijanhusak/laravel-form-builder 分支出来的。
目录
安装
使用 Composer
composer require balajidharma/laravel-form-builder
或者通过修改 composer.json
文件手动安装
{ "require": { "balajidharma/laravel-form-builder": "1.*" } }
并运行 composer install
演示
"Basic Laravel Admin Penel" 起步套件包含 Laravel 表单构建器
快速开始
创建表单类非常简单。使用一个简单的 artisan 命令
php artisan make:form Forms/SongForm --fields="name:text, lyrics:textarea, publish:checkbox"
表单创建在路径 app/Forms/SongForm.php
,内容如下
<?php namespace App\Forms; use BalajiDharma\LaravelFormBuilder\Form; use BalajiDharma\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 BalajiDharma\LaravelFormBuilder\Form; class PostForm extends Form { public function buildForm() { // Add fields here... } }
之后在控制器中实例化该类,并将其传递给视图
<?php namespace App\Http\Controllers; use Illuminate\Routing\Controller as BaseController; use BalajiDharma\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 BalajiDharma\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 BalajiDharma\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 BalajiDharma\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 BalajiDharma\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 BalajiDharma\LaravelFormBuilder\FormBuilder; use BalajiDharma\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')); } }