fdevs / serializer
FDevs 序列化组件
0.1.1
2016-07-07 13:45 UTC
Requires
- php: >=5.5.9
- psr/cache: ~1.0
- symfony/config: ~2.8|~3.0
- symfony/property-access: ~2.8|~3.0
- symfony/serializer: ~2.8|~3.0
This package is auto-updated.
Last update: 2024-08-29 04:42:52 UTC
README
如果你使用 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