krak/marshal

数据序列化和转换库

v0.2.3 2017-06-12 07:50 UTC

This package is auto-updated.

Last update: 2024-09-18 17:06:46 UTC


README

一个以函数式设计进行数据序列化的库。这适用于转换/序列化数据用于API输出,反序列化和填充序列化数据,或任何其他类型的转换。

用法

<?php

use Krak\Marshal as m;

$users = getUsers(); // get users from an orm or something

$m = m\map(function($user)
{
    return m\merge([
        m\keys(['id', 'first_name', 'last_name']),
        function($user) {
            return [
                'like_count' => (int) $user->like_count,
                'biography' => substr($user->biography, 0, 64),
                'created_at_ts' => $user->created_at->getTimestamp(),
            ];
        }
    ]);
});

$marshaled = $m($users);

/*
[
    [
        'id' => ...,
        'first_name' => ...,
        'last_name' => ...,
        'biography' => ...,
        'created_at_ts' => ...,
    ],
    ...
]
*/

访问器

对于某些序列化器,你可能希望以数组或对象的形式序列化实体。为此,我们有访问器。访问器实现了 Krak\Marshal\Access 接口。

<?php

interface Access {
    public function get($data, $key, $default = null);
    public function has($data, $key);
}

使用方法

<?php

$access = new Krak\Marshal\ArrayKeyAccess();
$data = ['a' => 1];
$access->has($data, 'a'); // true
$access->has($data, 'b'); // false
$access->get($data, 'a'); // 1
$access->get($data, 'b', 0); // 0

填充器

填充器用于将数组数据序列化为对象。每个填充器都是任何具有以下接口的可调用对象

<?php

interface Hydrator {
    public function __invoke($class, $data);
}
<?php

class MyClass {
    public $a;
    public $b;
}

$hydrate = publicPropertyHydrator();
$obj = $hydrate(new MyClass(), [
    'a' => 1,
    'b' => 2,
]);

// $obj now is hydrated with those values

API

hydrate($class, $hydrator = null)

创建一个序列化器,该序列化器将使用给定的 $class 参数填充数据,并将序列化器的 $class$data 传递给 $hydrator。如果没有提供填充器,将使用默认的 hydrator()

<?php

class MyClass {
    public $a;
}

$marshal = Krak\Marshal\hydrate(MyClass::class);
$obj = $marshal(['a' => 1]);
assert($obj instanceof MyClass);

keyMap($map)

将数据的键转换为新键

rename(array $map)

将键字段重命名为新名称

only(array $fields)

它仅包含给定的字段。其他所有内容都被过滤掉。

except(array $fields)

它包含所有除了给定的字段。其他所有内容都被保留。

filter(callable $filter)

通过签名 $filter($value, $key): bool 的过滤器函数过滤集合

dates($format = 'r')

使用给定的格式说明符格式化所有 DateTimeInterface 实例。

objectVars()

将对象的属性转换为数组。这仅仅是 get_object_vars 的别名。

typeCast(array $fields, $type)

将给定的字段转换为特定类型。

pipe($marshalers)

创建一个序列化器,将一个序列化器的结果传递给下一个序列化器

<?php

$m = pipe([camelizeKeys(), keys(['id', 'firstName'])]);
$m(['id' => 1, 'first_name' => 2]);

merge($marshalers)

创建一个序列化器,将 $marshalers 应用到值上,然后使用 array_merge 合并所有结果。这期望 $marshalers 返回数组。

keys($fields, Access $acc = null)

创建一个返回数据字段的序列化器

map($marshaler)

创建一个序列化器,它接受一个集合并返回每个序列化项的数组

collection($marshalers, Access $acc = null)

创建一个基于传递给集合的序列化器的序列化器。 $key => $marshaler 中的每个 $marshaler 将基于 $key 序列化 $key => value 中的每个 $value。

on($marshalers, Access $acc = null)

类似于 collection,它根据传递的序列化器的映射来序列化集合的字段。唯一的区别是它更新原始集合的字段并返回整个修改后的集合。

stringyKeys($cb)

通过允许将字符串实例传递给回调进行键操作来映射键

underscoredKeys()

使用 Stringy::underscored 函数将键转换为下划线样式键

camelizeKeys()

使用 Stringy::camelize 函数将键转换为 camelCase 风格键

identity()

创建一个身份函数的序列化器

mock($val)

创建一个总是返回 $val 的序列化器。这在测试中很有用。

notnull($marshaler)

创建一个不允许传递null值给marshaler的marshaler。如果传递了null值,它仅返回null而不调用marshaler

hydrator()

返回一个默认hydrator实例的静态缓存实例。

classNameHydrator($hydrator)

$class参数视为类名,并将实例化一个类并将调用委托给内部hydrator

publicPropertyHydrator()

将数组中的属性分配给通过公开访问属性传入的$class对象。

fromXML()

将XML字符串解析为数组。

<?php

$xml = <<<XML
<?xml version="1.0" ?>
<root a="1">
    <item>Value</item>
    <items>
        <item>1</item>
        <item>2</item>
    </items>
    <map id="1">
        <a>A</a>
        <b>B</b>
    </map>
    <node>
        <![CDATA[<cdata>]]>
    </node>
</root>
XML;
$unmarshal = Krak\Marshal\fromXML();
var_dump($unmarshal($xml));
/** Outputs:
array(5) {
  ["@a"]=>
  string(1) "1"
  ["item"]=>
  string(5) "Value"
  ["items"]=>
  array(1) {
    ["item"]=>
    array(2) {
      [0]=>
      string(1) "1"
      [1]=>
      string(1) "2"
    }
  }
  ["map"]=>
  array(3) {
    ["@id"]=>
    string(1) "1"
    ["a"]=>
    string(1) "A"
    ["b"]=>
    string(1) "B"
  }
  ["node"]=>
  string(7) "<cdata>"
}
*/

class ArrayKeyAccess

通过键对数组进行访问。

class ObjectPropertyAccess

通过属性名对对象属性进行访问。

class AnyAccess

如果数据是数组,将访问委托给ArrayKeyAccessObjectPropertyAccess

这是默认的访问器。

access()

返回AnyAccess的静态缓存实例。