cartapia/form-builder

表单构建工具 - 类似于symfony

1.51.101 2022-07-07 14:58 UTC

README

Build Status Coverage Status Total Downloads Latest Stable Version License

Laravel 5 表单构建工具

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

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

Laravel 4

要查看 Laravel 4 版本,请访问 laravel4-form-builder

Bootstrap 4 支持

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

升级到 1.6

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

更多详细信息请参阅 变更日志

文档

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

变更日志

变更日志可在 此处 找到。

安装

使用 Composer

composer require kris/form-builder

或手动修改 composer.json 文件

{
    "require": {
        "kris/form-builder": "1.*"
    }
}

然后运行 composer install

然后将服务提供者添加到 config/app.php

    'providers' => [
        // ...
        Cartapia\FormBuilder\FormBuilderServiceProvider::class
    ]

和 Facade(也在 config/app.php 中)

    'aliases' => [
        // ...
        'FormBuilder' => Cartapia\FormBuilder\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 Cartapia\FormBuilder\Form;
use Cartapia\FormBuilder\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 Cartapia\FormBuilder\Form;

class PostForm extends Form
{
    public function buildForm()
    {
        // Add fields here...
    }
}

之后,在控制器中实例化该类并将其传递给视图

<?php

namespace App\Http\Controllers;

use Illuminate\Routing\Controller as BaseController;
use Cartapia\FormBuilder\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 Cartapia\FormBuilder\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 Cartapia\FormBuilder\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 Cartapia\FormBuilder\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 Cartapia\FormBuilder\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 Cartapia\FormBuilder\FormBuilder;
use Cartapia\FormBuilder\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 测试进行覆盖。Pull requests 应包含测试并通过 Travis CI 构建。

要运行测试,首先使用 composer install 安装依赖项。

然后可以使用 vendor/bin/phpunit 运行测试