milo/hydrator

从数组中填充对象,将对象导出到数组

v0.3.1 2020-12-03 12:30 UTC

This package is auto-updated.

Last update: 2024-09-08 17:50:44 UTC


README

Build Status

用法

class Person
{
	/** @var string */
	public $name;

	public string $surname;

	public string|null $email;

	/** @var Address[] */
	public array $addresses;
}

class Address
{
	/** @var string */
	public $city;
}

$data = [
	'name' => 'Miloslav',
	'surname' => 'Hůla',
	'addresses' => [
		['city' => 'Prague'],
		['city' => 'Roztoky'],
	],
];


$backend = new Milo\Hydrator\Backend\PublicPropertiesBackend;
$hydrator = new Milo\Hydrator\Hydrator($backend);


/** @var Person $person  created from array */
$person = $hydrator->hydrate(Person::class, $data);

个人来说,我使用它来填充和导出以NEON(https://ne-on.org/)编写的配置。数组存储的配置很好,但是当配置变得过多时,重构变得困难。在IDE中使用类型提示对象要舒适得多,并且更不容易出错。

后端

目前只有一个后端。

PublicPropertiesBackend

它操作类的公共属性。它根据属性类型定义或@var注解进行类型检查。注解类型字符串必须采用联合格式(例如int|string|null)。类型检查是严格的,这意味着,整数不能转换为字符串或反之亦然,即使这是可能的。

为您自己的后端实现Milo\Hydrator\IHydratorBackend

缓存

实现ICache并将其与后端一起使用。它保存与类反射和FQCN(完全限定类名)解析相关的资源。

我正在使用一个简单的缓存类与Nette Caching一起。它看起来像

use Milo\Hydrator;
use Nette\Caching\Cache;
use Nette\Caching\Storage;


class HydratorCache implements Hydrator\Backend\ICache
{
	private Cache $cache;


	public function __construct(Storage $storage)
	{
		$this->cache = new Cache($storage, 'milo.hydrator');
	}


	public function save($key, $value, array $dependentFiles = null)
	{
		$dependencies = $dependentFiles
			? [Cache::FILES => $dependentFiles]
			: null;

		$this->cache->save($key, $value, $dependencies);
	}


	public function load($key)
	{
		return $this->cache->load($key);
	}
}

安装

使用Composer: composer require milo/hydrator

待办事项

  • 改善深层结构的错误信息,因为现在的信息很糟糕
  • 在Hydrator中支持超过一个数组维度