laravel-form-builder:基于 Laravel 5 的表单构建器项目

Laravel Form builder for version 5+!

分支4Tags69
当前项目代码仓暂无内容

Laravel 5 表单构建器

构建状态 覆盖率状态 总下载量 最新稳定版本 许可协议

Laravel 5 表单构建器

加入聊天

受 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
    ]

以及 Facade(同样在 config/app.php 中):

    'aliases' => [
        // ...
        'FormBuilder' => Kris\LaravelFormBuilder\Facades\FormBuilder::class
    ]

注意:此包会自动加载并注册 laravelcollective/html 包及其别名(Form, 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;
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()
    {
        // 在这里添加字段...
    }
}

之后,在控制器中实例化类并传给视图:

<?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();
        }

        // 进行保存和其他操作...
    }
}

替代示例:

<?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();
        }

        // 进行保存和其他操作...
    }
}

如需在表单提交后根据所有字段属性存储模型,可考虑以下代码:

<?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());

        // 进行重定向...
    }

仅保存需要的属性:

<?php

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Kris\LaravelFormBuilder\FormBuilder;
use App\SongForm;
use Illuminate\Http\Request;

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();

        // 进行重定向...
    }

或更新任意模型:

<?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());

        // 进行重定向...
    }

定义路由:

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

项目介绍

Laravel 表单构建器,适用于版本 5+!【此简介由AI生成】

定制我的领域
591.72 K305访问 GitHub