webfox / laravel-forms
一个 Laravel 表单包
Requires
- php: >=7.1
- laravel/framework: ^5.7|^5.8|^6.0|^7.0|^8.0|^9.0|^10.0
README
默认情况下,视图是为 beagle JavaScript 设置的,不包括在内
指令
表单打开
@form(['update' => route('some-model.store', [$model]), 'model' => $model, 'files' => true, 'extra' => [...]])
@form(['store' => route('some-model.store'), 'files' => true, 'extra' => [...]])
@form(['delete' => route('some-model.delete'), 'files' => true, 'extra' => [...]])
@form(['get' => route('search.route'), 'extra' => [...]])
注释
- 使用以下任何一种方法将自动追加 csrf _token 和正确的 route type _method 字段。
- 如果通过
'model'
键传递了一个模型,我们将使用它的数据来填充表单字段的值。 - 通过
'extra'
数组传递的任何内容都将作为属性追加到表单中。
表单关闭
@endform
注释
- 表单实际上是一个组件,这意味着你需要在使用完毕后关闭它。
- 这将解除对
'model'
的绑定,因此同一页上的未来表单不会受到影响。
表单字段
现在我们进入有趣的部分。表单字段的最小要求是一个名称
@formField(['name' => 'first_name'])
这将渲染一个 type="text"
表单字段,被一个带有 First Name
标签的表单组包裹,并具有适当的值,此外这将处理显示服务器端验证错误。
@formField(['name' => 'name', 'label' => 'Your Name'])
这将渲染如上,但标签将是 Your Name
@formField(['name' => 'name', 'label' => false])
这将渲染如上,但没有任何标签
@formField(['name' => 'work_email', 'type' => 'email' ])
这将渲染一个 type="email"
表单字段,遵循之前的规则
@formField(['name' => 'role', 'options' => ['k' => 'v', 'k2' => 'v2']])
这将渲染一个带有给定选项的 select
。如果没有找到此字段的值,我们还将预先添加一个空的 <option>
标签
@formField(['name' => 'roles', 'options' => ['k' => 'v', 'k2' => 'v2'], 'extra' => ['multiple']])
这将渲染一个带有给定选项的 select
,此外,选择框的名称将是 roles[]
@formField(['name' => 'first_name', 'extra' => ['required', 'data-boolean', 'data-something' => 'value']])
这将渲染一个具有以下附加属性的字段 required data-boolean data-something="value"
计算值
以下优先级顺序用于计算表单的值:0.通过 Laravel 的 old($fieldName)
助手匹配的输入。0.传递给 @form
的模型的属性。0.直接传递的值,例如 @formField(['name' => 'name', 'value' => 'John'])
。
此外,如果最终计算出的值是一个对象并且具有 getValue
方法,则将调用该方法。
关于 old 输入和多个表单的注释...
不幸的是,没有方法可以限制 Laravel 的 old($fieldName)
助手的作用域,这意味着如果页面上的一个表单有旧输入,页面上具有相同名称的所有字段都将被填充旧输入。这不是本包的限制,而是 Laravel 旧输入处理的一个限制。
关于模板、向后兼容性和支持的注释
我们已经开源了这个包,所以你也可以使用它,但这个包主要是为我们自己的内部使用设计的,这意味着一些模板有特定的规则,需要从我们的模板中运行 JavaScript,此外,我们将经常发布以添加我们需要的新的功能和修复,但这可能会破坏你的工作。
与其直接使用这个包,我们建议你将其分叉并维护一个组织内部的副本。
IDE 助手
如果你还没有添加,请将以下内容添加到你的项目的 .idea/blade.xml
文件中,以便 PHPstorm 了解指令
<data directive="@endform" /> <data directive="@form" injection="true" prefix="<?php function x(array $options) {}; x(" suffix="); ?>" /> <data directive="@formField" injection="true" prefix="<?php function x(array $options) {}; x(" suffix="); ?>" />