saasformation/magic-field

MagicField 是一个库,可以将混合值转换为期望的类型值(当可行时)。

1.0.3 2022-08-30 16:56 UTC

This package is auto-updated.

Last update: 2024-09-29 06:14:43 UTC


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();

两个优点

  1. 您现在有了类型化的值。
  2. 如果任何源值与类型更改不兼容,则将抛出 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 上打开一个问题。