b2pweb/bdf-serializer

Bdf Serializer 组件

v1.2.1 2024-02-26 09:48 UTC

README

Bdf Serializer 可以标准化、激活/提取和编码数据或对象。它使用 doctrine/instantiator 来实例化类,并使用 phpdocumentor 来读取注释。

build codecov Packagist Version Total Downloads Type Coverage

使用 Composer 安装

composer require b2p/bdf-serializer

基本用法

<?php

use Bdf\Serializer\SerializerBuilder;

$serializer = SerializerBuilder::create()->build();
$json = $serializer->toJson($object);
//...

声明元数据

提供两种驱动程序。静态方法调用和注释驱动程序。

静态方法驱动程序

声明您的静态方法以构建元数据

<?php

use Bdf\Serializer\Metadata\Builder\ClassMetadataBuilder;
use DateTime;

class User
{
    /**
     * @var integer
     */
    private $id;
    
    /**
     * @var string
     */
    private $name;
    
    /**
     * @var DateTime
     */
    private $date;
    
    /**
     * @param ClassMetadataBuilder $builder
     */
    public static function loadSerializerMetadata($builder)
    {
        $builder->integer('id');
        $builder->string('name');
        
        // You can also add group, alias, ...
        $builder->string('name')
            ->addGroup('all')
            ->alias('user_name')
            ->since('1.0.0');
            
        // DateTime options are available
        $builder->dateTime('date')
            ->dateFormat('Y/m/d H:i')
            ->timezone('+01:00')      // Use this timezone in internal
            ->toTimezone('+00:00');   // Export date with this timezone
    }
}

注释驱动程序

注释驱动程序使用 phpdocumentor/reflection-docblock。标签 @var 将被读取。如果没有找到标签,则默认类型为 string

支持的标签

  • var: 此注释指定属性的类型。此标签在反序列化时是必需的。
  • since: 启用对象版本控制。值指定从哪个版本开始此属性可用。
  • until: 启用对象版本控制。值指定此属性可用到的版本。
  • SerializeIgnore: 不要序列化此属性。

注意:如果在 phpdoc 中没有检测到类型,我们尝试添加 PHP 7.4 中添加的类型属性值

JMS/serializer 驱动程序

Bdf\Serializer\Metadata\Driver\JMSAnnotationDriver 驱动程序允许您使用 JMS 驱动程序。将使用 JMS 元数据来创建 Bdf 元数据。仅使用序列化器的一小部分选项。

  • serializedName
  • readOnly
  • inline
  • sinceVersion
  • untilVersion
  • getter
  • setter
  • groups
  • type

注意:此驱动程序与 jms/serializer > v3.0 和 php > v7.2 兼容

<?php

use Bdf\Serializer\Metadata\Driver\JMSAnnotationDriver;
use JMS\Serializer\Metadata\Driver\AnnotationDriver as BaseJMSAnnotationDriver;

$driver = new JMSAnnotationDriver(new BaseJMSAnnotationDriver(...));

序列化选项

NormalizationContext 包含规范化选项。

  • exclude: 从规范化中排除属性。
  • include: 包括规范化中的属性。
  • groups: 包括的属性组。
  • null: 如果为 true,则添加空值。
  • meta_type: 在有效载荷中包含元数据 "@type"。
  • version: 为支持版本控制序列化的对象设置版本。字符串版本应与 PHP 函数 version_compare 兼容。
  • circular_reference_limit: 循环引用的数量。默认值 1。
  • remove_default_value: 如果属性设置为默认值,则不要注入属性的值。

日期时间选项

  • dateFormat: 规范化选项,用于指定格式。
  • dateTimezone: 使用给定的时区格式化日期。
  • timezoneHint: 反规范化选项,用于帮助从输入字符串中检测时区。

可用于 NormalizationContextDenormalizationContext 的选项。

  • throws_on_accessor_error: 默认情况下,如果属性在写入或读取时抛出 Error,则跳过值。此选项将从访问器抛出错误(调试目的)。

示例

<?php

use \Bdf\Serializer\Context\NormalizationContext;

$object = (object)[
    "name" => "John",
    "age"  => null,
];

$builder = new \Bdf\Serializer\SerializerBuilder();
$builder->setNormalizers([new \Bdf\Serializer\Normalizer\ObjectNormalizer()]);

$serializer = $builder->build();
echo $serializer->toJson($object);
// {"name":"John"}

echo $serializer->toJson($object, [NormalizationContext::NULL => true]);
// {"name":"John","age":null}