rs/form-laravel

此软件包最新版本(v7.0.0)的许可证信息不可用。

Laravel 表单

v7.0.0 2024-03-26 17:48 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']);
    }

}