Symfony 框架内置序列化工具教程(三)

Symfony 框架内置序列化工具教程(三)

Chris Yue No Comment
Posts

上一篇文章我们提到了添加自定义的 Normalizer。这一篇将更加深入讨论自定义 Normalizer 的使用。

目前为止,我们所做的 Normalizer 只能老老实实按照我们的 Model 的结构序列化,我们最多只能通过 Serialize Group 的功能控制一下某些属性的隐显。但我们的接口可能需要提供 Model 结构外更多的信息,一个最常见的例子,提供 HATEOAS 风格的接口的时候,你需要提供相关对象所对应的接口的地址,而这个地址往往是 Model 不会提供的(Model 层也不应该提供),举个例子,如果我们有一个 User 类,它具有 Groups 属性,正常序列化后的结果可能是这样:

而 HATEOAS 过的结果,需要添加每一个 group 的 uri 信息:

这就需要我们为 group 对象单独写一个 Normalizer:

注册为服务:

只要这个 Normalizer 服务的优先级高于我们之前的 GetSetMethodNormalizer,无论是直接还是间接地序列化一个 group 对象,都会为 group 添加一个 uri 字段。

PHP 序列化里面最常遇到的问题,就是序列化时间对象(\DateTime 对象)。如果不给时间对象专门写一个 Normalizer,时间对象将会被序列化成跟 PHP 里的时间对象里结构一致的一维数组,而我们可能更需要显示成字符串形式。所以我们需要为时间对象专门来一个 Normalizer:

服务注册部分我就不写了,总之添加了此 Normalizer 之后,只要是时间对象都会被序列化为 ISO8601 的格式,注意 created_at 属性:

注:在 Symfony 3.0 之后,已经自带 DateTimeNormalizer

Symfony 框架内置序列化工具教程(三) by Chris Yue is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International License.

微信赞赏码

文章不错,我要帮站长分担建站费!
天使投赏人

发表评论

67 + = sixty eight