在开发过程中,我需要将用户提交的 json 数据转换为严格的 php 对象,以便在后续的业务逻辑中使用。这些对象包括命令(Command)对象和查询(Query)对象。最初,我尝试手动编写转换代码,但发现这不仅耗时,而且容易出错。尤其是当数据结构复杂时,处理起来更加棘手。
这时,我发现了 eventsauce/Object-hydrator 这个库。它可以将结构化数据(如 JSON)转换为严格的 PHP 对象,并且支持反向操作——将对象序列化为结构化数据。它的安装非常简单,只需运行以下命令:
composer require eventsauce/object-hydrator
使用这个库,我可以轻松地将 JSON 数据转换为对象。例如:
use EventSauceObjectHydratorObjectMapperUsingReflection; $mapper = new ObjectMapperUsingReflection(); class ExampleCommand { public function __construct( public readonly string $name, public readonly int $birthYear, ) {} } $command = $mapper->hydrateObject( ExampleCommand::class, [ 'name' => 'de Jonge', 'birth_year' => 1987 ], ); // 现在 $command 是一个 ExampleCommand 对象
不仅如此,这个库还支持复杂的对象嵌套和数组转换。例如:
立即学习“PHP免费学习笔记(深入)”;
class ChildObject { public function __construct( public readonly string $value, ) {} } class ParentObject { public function __construct( public readonly string $value, public readonly ChildObject $child, ) {} } $command = $mapper->hydrateObject( ParentObject::class, [ 'value' => 'parent value', 'child' => [ 'value' => 'child value', ] ], );
此外,eventsauce/object-hydrator 还提供了灵活的自定义映射和类型转换功能。你可以使用属性(attributes)来指定自定义的键映射和类型转换。例如:
use EventSauceObjectHydratorMapFrom; class ExampleCommand { public function __construct( public readonly string $name, #[MapFrom('year')] public readonly int $birthYear, ) {} }
在性能方面,这个库通过预编译的方式生成优化后的映射代码,可以实现比反射(reflection)快 3-10 倍的性能提升。
总的来说,eventsauce/object-hydrator 库不仅简化了 PHP 对象的序列化和反序列化过程,还提供了强大的自定义和性能优化功能。它让我能够专注于业务逻辑,而不必担心数据转换的细节,大大提高了开发效率。如果你也面临类似的问题,不妨尝试一下这个库。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END