e0ipso / shaper
一个轻量级库,用于处理PHP中的输入和输出转换。
1.2.4
2021-05-19 09:42 UTC
Requires
Requires (Dev)
- php-coveralls/php-coveralls: ^2.4
- phpunit/phpcov: ^8.2
- phpunit/phpunit: ^9.5
README
Shaper
Shaper是一个简单的库,它允许进行类型安全的数据转换。您可以进行简单的转换或队列转换。
单向转换
单向转换在数据只单向流动时很有用。一个例子是只读HTTP API,基于输出中的一个属性内容,会向外部服务发送请求,以在原始响应中包含额外数据。
简单转换
以类型安全的方式执行单一操作来转换数据。
use JsonSchema\Validator; use Shaper\Transformation\TransformationBase; use Shaper\Util\Context; use Shaper\Validator\JsonSchemaValidator; class NumberToArray extends TransformationBase { public function getInputValidator() { return new JsonSchemaValidator(['type' => 'number'], new Validator()); } public function getOutputValidator() { $schema = ['type' => 'array', 'items' => ['type' => 'number']]; return new JsonSchemaValidator($schema, new Validator()); } protected function doTransform($data, Context $context) { return [$context['keyName'] => $data]; } } $t = new NumberToArray(); $t->transform(42, new Context(['keyName' => 'data'])); // ['data' => 42] $t->transform(['foo']); // TypeError exception.
队列转换
以类型安全的方式执行一系列操作,一个接一个。
use JsonSchema\Validator; use Shaper\Transformation\TransformationBase; use Shaper\Util\Context; use Shaper\Validator\InstanceofValidator; use Shaper\Validator\JsonSchemaValidator; use Shaper\Transformation\TransformationsQueue; class ObjectToNumber extends TransformationBase { public function getInputValidator() { return new InstanceofValidator(\stdClass::class); } public function getOutputValidator() { $schema = ['type' => 'number']; return new JsonSchemaValidator($schema, new Validator()); } protected function doTransform($data, Context $context) { return isset($data->value) ? $data->value : 0; } } $t = new TransformationsQueue(); $t->add(new ObjectToNumber()); $t->add(new NumberToArray()); $input = new \stdClass(); $input->value = 42; $t->transform($input, new Context(['keyName' => 'data'])); // ['data' => 42]
双向转换(又称数据适配器)
数据适配器或可逆转换在数据可以双向流动时很有用。一个例子是公开内部存储的HTTP API。但是,内部存储的格式不是API想要公开的格式。为此,进入的数据需要转换为内部存储格式,而输出的数据需要转换为通过API公开的形状。
use JsonSchema\Validator; use Shaper\DataAdaptor\DataAdaptorBase; use Shaper\Util\Context; use Shaper\Validator\InstanceofValidator; use Shaper\Validator\JsonSchemaValidator; class MyDataAdaptor extends DataAdaptorBase { protected function doTransform($data, Context $context) { return $data->{$context['keyName']}; } protected function doUndoTransform($data, Context $context) { return (object) [$context['keyName'] => $data, 'bar' => 'default']; } public function getInputValidator() { // In a real world scenario we would describe this as a JSON Schema. return new InstanceofValidator(\stdClass::class); } public function getInternalValidator() { // In a real world this would be your internal data object. Something like cheking that this is // an object of class FieldItemInstance. return new JsonSchemaValidator(['type' => 'string'], new Validator()); } public function getOutputValidator() { // In a real world scenario we would describe this as a JSON Schema. In most cases the output // validator is the same as the input validator, so you can return the input validator here. return new InstanceofValidator(\stdClass::class); } } $da = new MyDataAdaptor(); $data = new \stdClass(); $data->lorem = 'caramba!'; $da->transform($data, new Context(['keyName' => 'lorem'])); // 'caramba!' $da->transform(new NodeObject()); // TypeError exception. $da->undoTransform('caramba!', new Context(['keyName' => 'lorem'])); // (object) ['lorem' => 'caramba!', 'bar' => 'default'] $da->undoTransform([]); // TypeError exception.