milo / hydrator
从数组中填充对象,将对象导出到数组
v0.3.1
2020-12-03 12:30 UTC
Requires
- php: >=5.6.0
Requires (Dev)
- nette/tester: ~2.0
README
用法
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中支持超过一个数组维度