saasformation / magic-field
MagicField 是一个库,可以将混合值转换为期望的类型值(当可行时)。
1.0.3
2022-08-30 16:56 UTC
Requires (Dev)
- phpunit/phpunit: ^9.5
README
FieldMagic 是一个库,可以将混合值转换为期望的类型值(当可行时)。
它非常有用,例如,在控制器中读取 JSON 请求体时。
安装
使用 composer 需要这个库
composer require saasformation/field-magic
入门指南
让我们假设您有一个以下数组的以下数据(可能是从 json_decode 调用获得的)
$data = [ 'name' => 'John', 'birthdate' => '1990-02-03', 'height' => 177, 'alive' => true, 'highSchoolQualificationsAverage' => 4.56, 'professions' => [ 'computing engineer', 'soldier' ] ];
现在,您可以这样做
$name = (new StandardField($data['name']))->string(); $birthdate = (new StandardField($data['birthdate']))->datetime(); $height = (new StandardField($data['height']))->integer(); $alive = (new StandardField($data['alive']))->boolean(); $highSchoolQualificationsAverage = (new StandardField($data['highSchoolQualificationsAverage']))->float(); $professions = (new StandardField($data['professions']))->array();
两个优点
- 您现在有了类型化的值。
- 如果任何源值与类型更改不兼容,则将抛出 InvalidConversionException。
如果您打算在控制器中从 JSON 请求体中获取数据,您可以这样做
abstract class BaseController { protected function field(string $path): StandardField { return new StandardField($this->getFromBodyRequestByPath($path)); } } class Controller extends BaseController { public function doSomething(): Response { $this->commandBus->handle( new CreatePersonCommand( $this->field('data.attributes.name')->string(), $this->field('data.attributes.birthdate')->datetime(), $this->field('data.attributes.height')->integer(), $this->field('data.attributes.alive')->boolean(), $this->field('data.attributes.highSchoolQualificationsAverage')->float(), $this->field('data.attributes.professions')->array(), ) ) } }
添加新的转换器
有时您觉得现有的 StandardField 转换器不足以满足需求。
要添加一个新的转换器,您必须创建一个新的 trait。
trait MyConverterCapable { public function addOneToInteger(): integer { return (int)$this->value + 1; } }
请注意 $this->value 是一个混合值,因此出于生产目的,您可能需要比示例中更好的数据验证。
现在,您需要创建一个新的 Field 类。如果您希望所有 StandardField 转换器也可用,则可以从 StandardField 继承。如果不是,则直接从 Field 继承。
class MyConverterField extends StandardField { use MyConverterCapable; }
现在您可以使用新的 Field 基类,就像使用 StandardField 一样。
$addedInteger = (new MyConverterField(1)->addOneToInteger(); // 2
stratdes/vo 的用户
使用 stratdes/vo 的用户可能会发现 saasformation/vo-magic-field-bridge 对于添加单 VO 和集合的转换器很有用。
问题
如果您在库中发现任何问题,请随时在 Github 上打开一个问题。