krak / marshal
数据序列化和转换库
Requires
- php: ^5.6 || ^7.0
- danielstjules/stringy: ^2.3
Requires (Dev)
- peridot-php/peridot: ^1.18
- phake/phake: ^2.0
- phpunit/phpunit: ~4.0
- symfony/var-dumper: ^2.0
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
如果数据是数组,将访问委托给ArrayKeyAccess
或ObjectPropertyAccess
。
这是默认的访问器。
access()
返回AnyAccess的静态缓存实例。