themadhenchman / encoder-annotation
该包允许将数据对象转换为基于注释的持久化格式。
Requires (Dev)
- php: 8.*
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-08 16:14:27 UTC
README
此库处于beta状态;根据使用案例或发现的问题,一些内部实现可能会更改。如果它影响持久化数据,将提供一种更新数据格式的方法。
目的
此模块的目的是允许PHP本身推断编码数据的所需结构。它将输出描述移至数据对象本身,并消除需要专用编码逻辑的需求。
灵感
此包受到GoLang JSON模块的启发。
可扩展性
此包提供的逻辑分为两部分,通过公共数据结构进行通信。
这些部分中的任何一个都可以通过一个定制的实现来替换,该实现可以用于将编码/解码扩展到除JSON以外的格式。
它还允许在转换过程中使用自定义逻辑。
请参阅提供的测试示例以获取一些说明。
部署
编码和解码的实现可以自由组合。
这需要在使用的代码中完成,并且只要遵守可扩展性要求,就不应该有任何问题。
否则,请提交错误报告。
使用此包时,您将想要初始化并使用提供的服务。
示例
#[DecodeClass(DataObject::class)] #[EncodeClass(DataObject::class)] class DataObject { #[EncodeProperty('dataObjectValue')] #[DecodeToProperty('dataObjectValue')] public int $computedValue; public function __construct(int $computedValue = 0) { $this->computedValue = $computedValue; } } $instance = new DataObject(44);
将此类的实例放入提供的服务中后,该类将持久化到
{ "dataObjectValue": 44 }
无需实现更多逻辑。
这对于更复杂的项目也适用。不支持同构集合(例如,包含各种数据类型,例如 [2,'a', new class{}]
)。
不同的对象可以组合和堆叠。如果提供的编码逻辑创建XML等,则结果不一定是JSON。您还可以将一个对象编码为另一个对象。此外,也可以对部分对象上已知属性进行编码(尽管必须在类级别进行注释)。
此前的迭代(尚未发布)还提供了方法调用的调用。然而,这模糊了数据和逻辑之间的界限,并且除非有很好的理由,否则不太可能(在将来)得到支持。
还将考虑将编码转换为其他格式(例如,目前XML是实施的一个候选)。它们受时间限制。
提供的属性参数在注释中将得到使用。目前该参数已提供,但尚未积极使用。请自由测试使用该参数的实现(例如,用于XML),并提供反馈/PR/错误报告。