ilyasavich/form-builder

用于 Laravel 应用的表单构建服务

v1.1.3 2018-08-04 12:11 UTC

README

用于 Laravel 的表单构建服务

安装

要求

composer require ilyasavich/form-builder

注册提供者和外观

in app.php config

'providers' => [
    // ...
    Savich\FormBuilder\FormServiceProvider::class,
],

发布配置

php artisan vendor:publish --provider="Savich\FormBuilder\FormServiceProvider" --tag=config

用法

首先,要创建新的表单,需要扩展基本 Form 类并重写 make 方法。此方法实现了表单构建逻辑

use Savich\FormBuilder\Form;
use Savich\FormBuilder\FormBuilder;

class UserForm extends Form
{
    protected function make(FormBuilder $builder): FormBuilder
    {
    }
}

创建输入

该包提供了创建所有可用的 HTML 输入。要在您的表单类中添加新的输入,需要调用构建实例的 add 方法。它的签名是...

public function add(string $inputNamespace, string $name, $value = null, array $options = []) : Input

要创建简单的输入,请写...

use Savich\FormBuilder\Form;
use Savich\FormBuilder\FormBuilder;
use Savich\FormBuilder\Inputs\EmailInput;

class UserForm extends Form
{
    protected function make(FormBuilder $builder): FormBuilder
    {
        $builder->add(EmailInput::class, 'email');
    }
}

自定义

属性

这里有几种方法可以自定义输入

// you can set input attributes in different ways
// also you can specify default input value

$value = 'Hello World!';
$attributes = ['class' => 'form-control'];
$builder->add(TextInput::class, 'input_name', $value)->attributes($attributes);
$builder->add(TextInput::class, 'input_name', $value, $attributes);

标签

$builder->add(TextInput::class, 'input_name')->label('My Label');

分组自定义

默认情况下,输入将以以下格式生成

$builder->add(TextInput::class, 'input_name');

// generated view

<div class="form-group">
    <input type="text" name="input_name">
</div>

如果您不需要将输入包裹在分组中

$builder->add(TextInput::class, 'input_name')->withoutGroup();

// generated view

<input type="text" name="input_name">

您可以自定义分组属性

$builder->add(TextInput::class, 'input_name')->groupAttributes(['class' => 'my-class', 'inputID']);

// generated view

<div class="my-class" id="inputID">
    <input type="text" name="input_name">
</div>

覆盖视图

如果您需要特定的输入生成,可以通过您的自定义覆盖默认视图

$builder->add(TextInput::class, 'input_name')->view('path.to.view');

在您需要覆盖视图而无需分组的情况下,您可以...

//this will overwrite code inside form-group div
$builder->add(TextInput::class, 'input_name')->internalView('path.to.view');

当您需要仅覆盖组时,您可以在视图中这样做...在视图中,您有 $input 对象,它是您的输入类的实例。

$builder->add(TextInput::class, 'input_name')->view('path.to.view');

// in resources.views.path.to.view
// in withoutGroupView there path to internal view, you can specify custom or there will be default
<div {!! $input->generateGroupAttributes() !!}>
    // write custom stuff ...
    @include($input->withoutGroupView)
</div>

可用输入属性

您可以在下面找到 $input 对象的可用属性列表

创建简单表单

例如,您需要创建一个至少包含两个输入的简单登录表单。好吧,它看起来可能是这样的

use Savich\FormBuilder\Form;
use Savich\FormBuilder\FormBuilder;

class LoginForm extends Form
{
    protected function make(FormBuilder $builder)
    {
        $builder->email('email')->label('Email');
        $builder->password('password')->label('Password');
        
        $builder->submit('Save');
    }
}

然后您需要在控制器动作中添加此表单

class LoginController extends Controller
{
    public function showLoginForm(LoginForm $form)
    {
        $formHtml = $form->create();
        
        return view('login')->with('form', $formHtml);
    }
}

最后,在视图文件中渲染表单

in resources/views/login.blade.php

{!! $form !!}

让我们创建一个提交登录表单的动作。在我们的控制器中

class LoginController extends Controller
{
    // ...
    
    public function login(LoginForm $form)
    {
        $form->request(); // access to request
        
        // login logic
    }
}