balajidharma/laravel-form-builder

Laravel 表单构建器

v1.0.3 2024-09-23 23:13 UTC

This package is auto-updated.

Last update: 2024-09-23 23:14:28 UTC


README

为您的 Laravel 项目添加表单构建器。

Total Downloads Latest Stable Version License

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'));
    }
}