fdevs/serializer

FDevs 序列化组件

0.1.1 2016-07-07 13:45 UTC

This package is auto-updated.

Last update: 2024-08-29 04:42:52 UTC


README

Build Status

如果你使用 Symfony 2,你可以使用我们的 序列化桥接器

安装

Serializer 使用 Composer,请访问 composer 网站 获取更多信息。

以下简单命令将安装 serializer 到你的项目中。它还会在你的 composer.json 中添加一个新条目并更新 composer.lock

composer require fdevs/serializer

使用示例

###创建模型

<?php

namespace App\Model;

class Post
{
    /**
     * @var string
     */
    protected $id;

    /**
     * @var \DateTime
     */
    protected $createdAt;

    /**
     * @var int
     */
    protected $views;

    /**
     * @var bool
     */
    protected $show;

    /**
     * @var User
     */
    protected $user;

    /**
     * @var float
     */
    protected $rate;

    /**
     * @var array|Comment[]
     */
    protected $comments;

    //init geters and setters
}

###创建映射

<?xml version="1.0" encoding="UTF-8" ?>
<serializer xmlns="http://4devs.pro/schema/dic/serializer-mapping"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://4devs.pro/schema/dic/serializer-mapping
        http://4devs.pro/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd">

    <class name="App\Model\Post">
        <option name="camel_to_snake">true</option><!-- if you needed convert name fields to snake case -->

        <property name="_id">
            <option name="serialized-name">id</option><!-- if you needed change serializer name fields -->
            <option name="group"><!-- if you use groups -->
                <value>short</value>
            </option>
        </property>

        <property name="createdAt">
            <type name="datetime"/><!-- set type if field not string -->
        </property>

        <property name="show">
            <type name="boolean"/>
        </property>

        <property name="views">
            <type name="int"/>
        </property>

        <property name="user">
            <type name="object">
                <option name="class">App\Model\User</option>
            </type>
        </property>

        <property name="rate">
            <type name="float"/>
        </property>

        <property name="comments">
            <type name="collection">
                <option name="type">object</option>
                <option name="options">
                    <value key="class">App\Model\Comment</value>
                </option>
            </type>
        </property>

    </class>

</serializer>

初始化序列化器

use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use FDevs\Serializer\Normalizer\ObjectNormalizer as FDevsNormalizer;
use FDevs\Serializer\Mapping\Factory\LazyLoadingMetadataFactory;
use FDevs\Serializer\Mapping\Loader\XmlFilesLoader;
use App\Model\Post;

$files = ['/path/to/xml/Model.Post.xml'];
$loader = new XmlFilesLoader($files);

//init metadata factory
$loadingMetadata = new LazyLoadingMetadataFactory($loader);


$encoders = array(new XmlEncoder(), new JsonEncoder());
$normalizers = array(new FDevsNormalizer($loadingMetadata), new ObjectNormalizer());

$serializer = new Serializer($normalizers, $encoders);

//init $post
$post = new Post();
echo $serializer->serialize($post);

//get your array data
$data = [];
$post = $serializer->serialize($data,Post::class);

选项

选项有两种类型:名称转换和可见性选项。它们可以在属性和类级别使用。

名称转换用于更改名称

  • camel_to_snake
  • name-prefix
  • serialized-name

可见性用于显示值

  • 字段
<?xml version="1.0" encoding="UTF-8" ?>
<serializer xmlns="http://4devs.pro/schema/dic/serializer-mapping"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://4devs.pro/schema/dic/serializer-mapping
        http://4devs.pro/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd">

    <class name="App\Model\Post">
        <option name="camel_to_snake">true</option><!-- if you needed convert name fields to snake case -->
        <option name="fields"/> <!-- if you needed filters field in request -->
        
        <property name="_id">
            <option name="serialized-name">id</option><!-- if you needed change serializer name fields -->
            <option name="group"><!-- if you use groups -->
                <value>short</value>
            </option>
        </property>

        <property name="createdAt">
            <option name="name-prefix">pre_</option><!-- if you needed add prefix serialized name -->
            <type name="datetime"/><!-- set type if field not string -->
        </property>
    </class>

</serializer>

添加选项

创建你的名称转换选项

<?php

namespace App\Serializer\Option\NameConverter;

use FDevs\Serializer\Option\NameConverterInterface;

class NameSuffix implements NameConverterInterface
{
    /**
     * {@inheritdoc}
     */
    public function convert($propertyName, array $options, $type = self::TYPE_NORMALIZE)
    {
        return $propertyName.implode('', $options);
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'name-suffix';
    }
}

创建你的可见性选项

<?php

namespace App\Serializer\Option\Visible;

use FDevs\Serializer\Option\VisibleInterface;

class VersionOption implements VisibleInterface
{
    const CONTEXT_KEY = 'version';

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'version';
    }

    /**
     * {@inheritdoc}
     */
    public function isVisible($propertyName, $value, array $options, array $context)
    {
        return !isset($context[static::CONTEXT_KEY]) || !is_array($context[static::CONTEXT_KEY]) || !count($context[static::CONTEXT_KEY]) || $context[static::CONTEXT_KEY] == reset($options);
    }
}

使用选项

<?xml version="1.0" encoding="UTF-8" ?>
<serializer xmlns="http://4devs.pro/schema/dic/serializer-mapping"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://4devs.pro/schema/dic/serializer-mapping
        http://4devs.pro/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd">

    <class name="App\Model\Post">
        <option name="name-suffix">_suffix</option>
        
        <property name="views">
            <option name="version">1.0</option>
            <type name="int"/>
        </property>
    </class>

</serializer>

将选项添加到正常化器中

use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use FDevs\Serializer\Normalizer\ObjectNormalizer as FDevsNormalizer;
use FDevs\Serializer\Mapping\Factory\LazyLoadingMetadataFactory;
use FDevs\Serializer\Mapping\Loader\XmlFilesLoader;
use FDevs\Serializer\OptionRegistry;
use App\Serializer\Option\NameConverter\NameSuffix;
use App\Serializer\Option\Visible\VersionOption;
use FDevs\Serializer\DataTypeFactory;
use App\Model\Post;

$files = ['/path/to/xml/Model.Post.xml'];
$loader = new XmlFilesLoader($files);

//init metadata factory
$loadingMetadata = new LazyLoadingMetadataFactory($loader);

//create OptionRegistry
$optionRegistry = new OptionRegistry();
$optionRegistry->addOption(new NameSuffix());
$optionRegistry->addOption(new VersionOption());

//create DataTypeFactory
$dataTypeFactory = new DataTypeFactory();

$normalizer = new FDevsNormalizer($loadingMetadata, $dataTypeFactory, $optionRegistry);


$serializer = new Serializer([$normalizer, new ObjectNormalizer()], [new XmlEncoder(), new JsonEncoder()]);

许可证

本库受 MIT 许可证保护。请参阅库中的完整许可证。

LICENSE

4devs 创建 - 请查看我们的 博客,了解更多关于此以及其他开源项目的信息。