happyr/serializer-bundle

Symfony的serializer组件之上的一个扩展包。它支持注解。

安装: 84

依赖者: 0

建议者: 0

安全: 0

星标: 21

关注者: 3

分支: 0

开放问题: 1

类型:symfony-bundle

0.1.0 2016-07-14 22:53 UTC

This package is auto-updated.

Last update: 2024-08-25 06:53:45 UTC


README

Latest Version Software License Build Status Code Coverage Quality Score Total Downloads

使Symfony的serializer组件易于使用。

安装

通过Composer

$ composer require happyr/serializer-bundle

在您的kernel中启用扩展包

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new Happyr\SerializerBundle\HappyrSerializerBundle(),
    );
}

用法

use \Happyr\SerializerBundle\Annotation as Serializer;

/**
 * @Serializer\ExclusionPolicy("all")
 */
class Car
{
    /**
     * @Serializer\Expose
     */
    private $size = 'Small';
    
    /**
     * @Serializer\Expose
     * @Serializer\Accessor({"getter":"getModel"})
     */
    private $model = 'Volvo';

    private $color = 'Red';
    
    public function getModel()
    {
        return 'This is model: '.$this->model;
    }
}

class Owner
{
    private $name;

    /**
     * @Serializer\Type("Car")
     */
    private $car;

    /**
     * @Serializer\ReadOnly
     */
    private $birthday;

    public function __construct()
    {
        $this->name = 'Tobias';
        $this->car = new Car(true);
        $this->birthday = new \DateTime('1989-04-30');
    }
}

$json = $this->container->get('serializer')->serialize(new Owner(), 'json');
var_dump($json);
{
  "name":"Tobias",
  "car":{
    "size":"Small",
    "model":"This is model: Volvo"
  },
  "birthday":"1989-04-30T00:00:00+02:00"
}

内部机制

此扩展包为Symfony的serializer组件提供了一个自定义的规范化器。这使得该规范化器非常灵活。如果您想以非常定制的方式序列化对象,请按照Symfony文档中描述的方法添加自己的序列化器。

配置

您需要提供一条或多条路径,指向您的源代码所在位置。

// app/config/config.yml
happyr_serializer:
  source: ['%kernel.root_dir%/../src'] # default
  twig_extension: false # default

添加元数据

目前,您只能使用注解来配置规范化器。这些注解与JmsSerializer非常相似。

@ExclusionPolicy

此注解可以定义在类上,以指示该类应使用的排除策略。

@Exclude

此注解可以定义在属性上,以指示该属性不应序列化/反序列化。仅与ExclusionPolicy = "NONE"结合使用。

@Expose

此注解可以定义在属性上,以指示该属性应序列化/反序列化。仅与ExclusionPolicy = "ALL"结合使用。

@SerializedName

此注解可以定义在属性上,以定义属性的序列化名称。如果未定义,则属性将从驼峰式转换为下划线分隔的小写名称,例如camelCase -> camel_case。

@Groups

此注解可以定义在属性上,以指定在仅序列化特定组时是否应序列化该属性。如果排除,则属性/方法将获得"默认"组。

@Accessor

此注解可以定义在属性上,以指定哪个公共方法应该被调用以检索或设置给定属性的值。默认情况下,我们通过反射访问属性。

<?php
use \Happyr\SerializerBundle\Annotation as Serializer;

class User
{
    private $id;

    /** 
     * @Serializer\Accessor(getter="getTrimmedName",setter="setName") 
     */
    private $name;

    // ...
    public function getTrimmedName()
    {
        return trim($this->name);
    }

    public function setName($name)
    {
        $this->name = $name;
    }
}

@ReadOnly

此注解可以定义在属性上,以指示属性的属性是只读的,不能在反序列化期间设置。

可以使用@ReadOnly(false)注解将属性标记为非只读(当类被标记为只读时很有用)。