kris/laravel-form-builder

Laravel 表单构建器 - 类似 Symfony

1.53.1 2024-04-29 16:32 UTC

README

Build Status Coverage Status Total Downloads Latest Stable Version License

Laravel 5 表单构建器

Join the chat at https://gitter.im/kristijanhusak/laravel-form-builder

受 Symfony 表单构建器启发的 Laravel 5 表单构建器。借助 Laravel 的 FormBuilder 类创建可轻松修改和重用的表单。默认支持 Bootstrap 3。

Laravel 4

有关 Laravel 4 版本的更多信息,请参阅 laravel4-form-builder

Bootstrap 4 支持

要使用 Bootstrap 4 而不是 Bootstrap 3,请安装 laravel-form-builder-bs4

升级到 1.6

如果您已从 1.5.* 或更早版本升级到 >1.6.*,并且在使用表单值绑定时遇到问题,请将 default_value 重命名为 value

更多详情请参阅 变更日志

文档

有关详细文档,请参阅 https://kristijanhusak.github.io/laravel-form-builder/

变更日志

变更日志可以在 此处 找到。

安装

使用 Composer

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 容器中不存在。

快速入门

创建表单类非常简单。使用简单的 artisan 命令

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 运行测试