ilyasavich / form-builder
用于 Laravel 应用的表单构建服务
v1.1.3
2018-08-04 12:11 UTC
Requires
- laravel/framework: ^5.3
- laravelcollective/html: ^5.4
Requires (Dev)
- phpspec/prophecy: ~1.0
- phpunit/phpunit: ~5.7
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
}
}