rs / form-laravel
Laravel 表单
Requires
- php: ^8.0
- illuminate/contracts: ^7.0|^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- laravel/legacy-factories: ^1.1
- orchestra/testbench: ^8.0
- dev-master
- v7.0.0
- v6.6.0
- v6.5.0
- v6.4.0
- v6.3.1
- v6.3.0
- v6.2.5
- v6.2.4
- v6.2.3
- v6.2.2
- v6.2.1
- v6.2.0
- v6.1.0
- v6.0.1
- v6.0.0
- v5.8.11
- v5.8.10
- v5.8.9
- v5.8.8
- v5.8.7
- v5.8.6
- v5.8.5
- v5.8.4
- v5.8.3
- v5.8.2
- v5.8.1
- v5.8.0
- v5.7.2
- v5.7.1
- v5.7.0
- v5.6.2
- v5.6.1
- v5.6.0
- 5.5.x-dev
- v5.5.1
- v5.5.0
- 5.4.x-dev
- v5.4.0
- dev-formlets
- dev-blade
This package is auto-updated.
Last update: 2024-09-26 18:48:46 UTC
README
安装
composer require rs/form-laravel
可以通过发布它们来更改视图文件。默认情况下,它们使用 bootstrap 4 类。
php artisan vendor:publish --tag=form
快速入门
创建表单组件
可以使用 artisan 创建表单组件。
php artisan make:formlet UserForm
默认情况下,表单组件将在路径 app/Http/Formlets
中创建。
<?php namespace App\Http\Formlets; use RS\Form\Formlet; class UserForm extends Formlet{ /** * Prepare the form with fields * * @return void */ public function prepare():void { } /** * Validation rules that apply to the form. * * @return array */ public function rules(): array { return []; } }
为表单组件添加前缀
当页面上有多个表单可能共享相同的字段名时,这很有用。为了正确填充错误和字段,我们可以为我们的表单提供一个前缀。
<?php class TestForm extends Formlet{ public function __construct(){ $this->setPrefix('test'); } }
所有字段和子表单组件字段现在都将以前缀命名。此外,错误也将添加到同名的单独的错误包中。
<input name="test:name"/> <input name="test:email"/>
在测试时,请确保将前缀添加到您的提交值中。
向表单组件添加字段
下一步是向表单添加字段。字段是通过在准备函数中使用添加方法添加的。准备允许我们设置所有字段以供渲染。
添加函数接受任何扩展 RS\Form\Fields\AbstractField
的字段类型。
<?php namespace App\Http\Formlets; use RS\Form\Formlet; use RS\Form\Fields\Input; class UserForm extends Formlet{ /** * Prepare the form with fields * * @return void */ public function prepare():void { $field = new Input('text','name'); $this->add($field); } /** * Validation rules that apply to the form. * * @return array */ public function rules(): array { return [ 'name'=> 'required' ]; } }
注意我们添加了验证规则。规则可以按照 Laravel 文档定义。
查看表单
我们可以在控制器中实例化表单并将表单数据传递给视图。
<?php namespace App\Http\Controllers; use Illuminate\Routing\Controller as BaseController; use App\Http\Formlets\UserForm; class UserController extends BaseController { public function create(UserForm $form) { $data = $form->route('users.store')->build(); return view('user.create',$data); } public function store(UserForm $form) { $form->store(); } }
创建方法为我们创建表单视图。我们通过名称传递路由,以便它知道要提交到哪个位置以及使用哪种 HTTP 方法。构建将返回一个包含有关表单和字段的数组,这些数组可用于渲染视图。我们还在表单上使用存储方法处理提交。目前它并没有做什么,但我们稍后可以看到如何处理提交。
渲染视图
@form(['form'=>$form]) @formlet() @enform
我们使用一些自定义 blade 指令来渲染表单。表单指令需要传递给视图的表单键。表单组件指令将渲染字段。
处理提交
在控制器中,我们使用存储方法在执行持久方法之前运行所有验证。
如果提交验证失败,表单将重定向回并填充包含表单错误的会话。默认情况下,所有错误都将渲染在具有错误的字段旁边。
如果验证通过,则默认情况下,持久方法将尝试将字段插入到已设置的模型中。
<?php namespace App\Http\Formlets; use RS\Form\Formlet; use RS\Form\Fields\Input; class UserForm extends Formlet{ public function __construct(User $user) { $this->model = $user; } public function prepare(): void { // Prepare the fields. } }
如果需要,我们可以重写持久方法。
验证
钩子
在每次验证表单之前,我们可以使用 prepareForValidation 方法在验证之前修改表单组件的输入。这将针对每个表单组件运行。
<?php namespace App\Http\Formlets; use RS\Form\Formlet; class UserForm extends Formlet{ public function prepare(): void { // Prepare the fields. } protected function prepareForValidation() { $this->mergeInput(['name'=>'John']); } }