adamthehutt/laravel-lean-forms

此包已被废弃,不再维护。没有建议的替代包。

Laravel的基于代码的表单配置。轻量级、简洁、高效的blade模板。业务逻辑和UI/显示逻辑完全分离。

v0.6.0 2020-09-24 02:48 UTC

README

安装

composer require adamthehutt/laravel-lean-forms

如果您想更改默认皮肤或自定义模板

php artisan vendor:publish

基本用法

此包提供了一种表达式的语法来定义表单和字段,同时允许您将所有领域逻辑保持在Blade模板之外。

例如

use AdamTheHutt\LeanForms\AbstractForm;
use AdamTheHutt\LeanForms\Elements\Select;
use AdamTheHutt\LeanForms\Elements\Text;
use AdamTheHutt\LeanForms\Elements\Textarea;

class AnimalCreate extends AbstractForm
{
    public $fields = [
        'name' => Text::class,
        'description' => Textarea:class
    ];

   /**
    * This field is a bit more complex so we'll define it explicitly rather
    * than simply in $this->fields.
    */
    public function preferredDiet()
    {
        return $this->element(Select::class)
                    ->multiple()
                    ->options(['Plants', 'Bugs', 'Humans']);
    }
}

然后在您的模板中,您只需要关注客户端或显示逻辑

{{ $form->open() }}

{{ $form->name()
        ->attr("v-model", "animalName") }}

{{ $form->description()
        ->data("toggle", "tooltip")
        ->title("Description goes here, dummy") }}

{{ $form->preferredDiet()->class("foo-bar") }}

注意:请确保编译您的JavaScript资源!

表单生成器

此包包含一个Artisan命令用于生成新的表单类

php artisan make:lean-form "App\Http\Forms\Animal\Create"

当然,您可以在您喜欢的命名空间和位置存储表单类。

表单配置

通常,此包会尝试基于命名约定进行一些合理的猜测,但您始终可以选择明确指定。以下是一些您应该了解的表单类属性和方法

$method属性 — 可以设置为任何标准REST HTTP动词。如果没有明确设置,则包将尝试根据表单类名称进行猜测。例如,如果类名称为(或以“Create”结尾),则使用POST;对于“Edit”,使用PUT;对于“Destroy”,使用DELETE。

$route属性或方法 — 属性可以设置为已定义的路由的字符串名称。更复杂的路由可以实现route()方法并返回,例如,route("animal.update", [$animal->id])。如果既没有定义属性也没有定义方法,则包将尝试根据表单类名称和模型名称进行猜测。例如,如果表单类的基名为AnimalEdit,相关的模型为Animal,则将猜测route("animal.update", [$animal])。

$files属性 — 如果您需要表单接受文件上传,请将$files属性设置为true。

字段 — 您的表单类逻辑可能主要涉及配置字段。您有两种方法可以这样做。

  1. 使用简单的字段名称到所需Element类名称的映射定义$fields属性,例如:$fields["foo" => Text::class]。这在最基本和常规场景中工作。在上面的例子中,它将导致具有id和name "foo"的文本字段,并应用所有默认逻辑。
  2. 为特定表单字段定义一个方法。这允许通过流畅的界面进行广泛的定制。(在Blade模板中引用字段时也可以使用这些方法。)以下是一些可用的选项
    • name($value) — 设置表单字段的名称(默认为定义方法的snake_case名称)
    • id($value) — 设置id属性(默认为名称)
    • label($value) — 设置标签文本(默认为用户友好的名称版本)
    • class($value) — 覆盖元素的模板默认值
    • labelClass() — 覆盖标签的模板默认值
    • options($map) — 用于选择、单选框等的键值数组或选项集合
    • value($value) — 设置字段的值(覆盖模型属性)
    • default($value) — 如果为空,则设置默认值
    • data($key, $value) — 在元素上设置数据-xyz属性
    • attr($key, $value) — 设置任意的HTML属性
    • readonly(), multiple(), placeholder($value),等等 — 设置相应的HTML属性

支持的字段类型

以下字段类型目前受到支持

  • 按钮
  • 复选框
  • 布尔复选框
  • 货币
  • 日期选择器 & 日期时间选择器: https://github.com/flatpickr/flatpickr
  • 电子邮件
  • 文件
  • 隐藏
  • 月份
  • 数字
  • 密码
  • 单选按钮
  • 选择
  • 提交
  • 文本
  • 多行文本框

Blade模板

在Blade模板中生成表单HTML就像调用相关方法一样简单。您还可以使用方法链来附加显示或客户端逻辑,例如:

  • $form->open()
  • $form->name()->labelClass("sr-only")
  • $form->description()->attr("v-model", "animalDescription")
  • $form->submit("保存动物")
  • $form->close()

表单皮肤

该包支持根据不同的约定或标准“皮肤化”表单。默认皮肤是Bootstrap 3,同时支持Bootstrap 4。(欢迎为支持其他皮肤的模板创建拉取请求!)您可以通过在.env文件中设置LEAN_FORMS_SKIN值来为表单配置默认皮肤。您也可以通过更改$skin属性为单个表单设置。

表单字段包装

默认皮肤自动将每个表单字段包装在div.form-group元素中,并生成相应的标签元素。您可以通过调用以下内容来关闭此行为:

{{ $form->open()->nowrap() }}

为了进行更细致的控制,您还可以在特定元素上调用$element->nowrap(),或者甚至在字段上指定$includeLabel和/或$includeFormGroup属性。

确定字段值

当表单加载时,字段值通常根据以下(按降序)优先级确定

  1. 已提交的表单输入,即old($name)
  2. 显式分配的值,即$form->animal()->value("giraffe")
  3. 字段名称的模型属性,即$form->model->animal
  4. 显式分配的默认值,即$form->animal()->default("giraffe")

注意:还有一个特殊的"__value"属性,它用于内部,但除非您正在扩展表单元素类或修改模板,否则您不需要担心它。

查找表单类

您始终可以直接使用,例如,new MyForm($model)来实例化表单类。

您还可以使用库的服务容器绑定来定位类。例如,如果您有一个名为App\Http\Forms\Animal\Create的表单类,您可以使用以下内容创建一个新的实例:

$form = app("forms")->form("animal.create", $model);

这段文字稍微有点冗长,但当与在 lean-forms.php 配置文件中配置命名空间的能力结合使用时,可能会很有用。通过在配置文件中定义命名空间数组,您可以设置一个优先查找表单类的命名空间列表。这允许包开发者包括默认表单类,这些表单类可以通过优先考虑 App 命名空间轻松被覆盖。

LeanFormsManager 类也可以被调用,因此上面的内容可以稍微缩短为

$form = app("forms")("animal.create", $model);