rickselby / laravel-request-field-types
允许定义请求中常见的输入字段类型
Requires
- laravel/framework: 10.*|11.*
Requires (Dev)
- graham-campbell/testbench: ^6.0
- phpunit/phpunit: ^10.0
README
在中央位置定义常见的输入字段类型,并在应用程序的所有请求中使用它们。
注意:3.x 版本通过了测试,但我还没有真正尝试过;我将在某个时候这么做,并可能编写更好的测试...
安装
$ composer require rickselby/laravel-request-field-types
Laravel >=5.5 时,服务提供程序将自动注册。
术语
在这里,“字段”被用作两个不同的术语;我希望我在整个文档中都保持清晰。
- 字段类型 - 例如日期、姓名、电子邮件...
- 输入字段 - 请求中作为部分提交的字段
定义字段类型
每个字段都必须实现 RickSelby\LaravelRequestFieldTypes\InterfacesFieldTypeInterface
。 RickSelby\LaravelRequestFieldTypes\BaseFieldType
实现了该接口并设置了一些常用功能,是开始实现您自己的字段的好地方。
从 BaseFieldType
需要实现两件事
rules()
- 输入字段的默认规则setMessagesFor($inputField)
- 定义输入字段的任何自定义消息
包括一个示例字段(DateFieldType)。
在请求中使用字段类型
首先扩展 RickSelby\LaravelRequestFieldTypes\FieldTypesRequest
而不是 Illuminate\Foundation\Http\FormRequest
。
然后,需要定义两个函数
- defineRules()
- defineMessages()
不需要定义 rules()
和 messages()
;这些在类内部管理。
defineRules()
在 rules()
中添加规则到数组,我们可以在这里使用函数定义它们。
对于定义的字段类型,使用 setInputsFor()
$this->setInputsFor(DateFieldType::class, ['start_date', 'end_date']); // Passing a key => value pair allows extra rules to be added to an input field; $this->setInputsFor(DateFieldType::class, ['start_date' => 'required']); // Keyed and non-keyed field names can be mixed as required $this->setInputsFor(DateFieldType::class, ['start_date' => 'required', 'end_date']);
对于其他字段,可以直接使用 setRules()
设置规则
$this->setRules('otherfield', ['required', 'numeric']);
排序
请求会跟踪设置规则的顺序,并按给定顺序返回规则,因此验证消息将按所需顺序返回。如果需要,可以覆盖字段顺序。
$this->setFieldOrder(['field1', 'field2'...]);
defineMessages()
可以在字段类型中设置定义的字段类型默认规则的自定义消息。其他消息可以使用 setMessage()
设置规则。
$this->setMessage('start_date.required', 'A start date must be provided.');
修改请求数据
(这可能是一种有争议的修改输入的方式,但对我来说是有意义的...)
假设我们有一个日期字段。输入字段知道将生成什么格式的数据,而请求将知道验证什么格式的数据。它在哪里被转换以供应用程序的其余部分使用?我们需要在其他地方定义日期格式,还是可以在请求中处理?
由于请求知道预期的输入格式,似乎修改(有效)数据的正确位置就在请求中。
提供的 DateFieldType
就这样做;在验证成功但返回验证之前,将运行 mapAfterValidationFunction
在为该字段类型设置的此字段的所有输入字段上。
如果您需要对请求数据进行更复杂的修改,可以直接覆盖 modifyInputAfterValidation
函数。
...但为什么要这样做呢?
这主要是由修改请求数据的愿望驱动的。
从日期字段开始——我是否必须在每个请求中定义日期格式?我能否有一个基础请求,其他请求都从此扩展,并在那里定义它?我能否在将其返回到应用程序之前将输入转换为碳实例?
然后,其他字段也遵循同样的模式——其他可以被修改为更适合在应用程序中使用格式的输入。应用程序的基础请求变得庞大且难以管理,因此产生了这个类。
也许对于在应用程序内定义常见的字段类型来说,这有些过度了。