WBE/laravel-form-builder

Laravel表单构建器 - 类似Symfony

1.15.1 2018-07-11 10:44 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

升级到1.6

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

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

文档

有关详细文档,请参阅 http://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包,并在IoC容器中不存在时加载别名(表单、Html)。

快速开始

创建表单类很简单。使用简单的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;

class SongForm extends Form
{
    public function buildForm()
    {
        $this
            ->add('name', 'text', [
                'rules' => 'required|min:5'
            ])
            ->add('lyrics', 'textarea', [
                'rules' => 'max:5000'
            ])
            ->add('publish', '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...
    }
}

创建路由

// 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 App\Forms\SongForm;

class SongsController extends BaseController {

    public function create(FormBuilder $formBuilder)
    {
        $form = $formBuilder->createByArray([
                        [
                            'name' => 'name',
                            'type' => 'text',
                        ],
                        [
                            'name' => 'lyrics',
                            'type' => 'textarea',
                        ], 
                        [
                            'name' => 'publish',
                            'type' => 'checkbox'
                        ],
                    ]
            ,[
            'method' => 'POST',
            'url' => route('song.store')
        ]);

        return view('song.create', compact('form'));
    }
}

贡献

项目遵循PSR-2标准,并用PHPUnit测试覆盖。拉取请求应包括测试并通过Travis CI构建。

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

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