rickselby/laravel-request-field-types

允许定义请求中常见的输入字段类型

3.8.0 2024-03-14 12:10 UTC

README

PHP 7.0+ Build Status SensioLabs Insight Code Coverage Software License

在中央位置定义常见的输入字段类型,并在应用程序的所有请求中使用它们。

注意:3.x 版本通过了测试,但我还没有真正尝试过;我将在某个时候这么做,并可能编写更好的测试...

安装

$ composer require rickselby/laravel-request-field-types

Laravel >=5.5 时,服务提供程序将自动注册。

术语

在这里,“字段”被用作两个不同的术语;我希望我在整个文档中都保持清晰。

  • 字段类型 - 例如日期、姓名、电子邮件...
  • 输入字段 - 请求中作为部分提交的字段

定义字段类型

每个字段都必须实现 RickSelby\LaravelRequestFieldTypes\InterfacesFieldTypeInterfaceRickSelby\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 函数。

...但为什么要这样做呢?

这主要是由修改请求数据的愿望驱动的。

从日期字段开始——我是否必须在每个请求中定义日期格式?我能否有一个基础请求,其他请求都从此扩展,并在那里定义它?我能否在将其返回到应用程序之前将输入转换为碳实例?

然后,其他字段也遵循同样的模式——其他可以被修改为更适合在应用程序中使用格式的输入。应用程序的基础请求变得庞大且难以管理,因此产生了这个类。

也许对于在应用程序内定义常见的字段类型来说,这有些过度了。