fivepercent/object-mapper

将数组数据映射到对象

v1.0 2015-06-04 10:50 UTC

This package is not auto-updated.

Last update: 2024-09-28 17:43:48 UTC


README

使用此包,您可以映射 array 数据到 object 实例。

安装

在您的 composer.json 中添加 FivePercent/ObjectMapper

{
    "require": {
        "fivepercent/object-mapper": "~1.0"
    }
}

现在运行命令来告诉 composer 下载库

$ php composer.phar update fivepercent/object-mapper

基本用法

在使用 ObjectMapper 之前,您必须配置实例

  1. 创建一个元数据工厂以从对象加载元数据
  2. 创建一个策略管理器
use Doctrine\Common\Annotations\AnnotationReader;
use FivePercent\Component\ObjectMapper\Strategy\StrategyManager;
use FivePercent\Component\ObjectMapper\Metadata\MetadataFactory;
use FivePercent\Component\ObjectMapper\Metadata\Loader\AnnotationLoader;
use FivePercent\Component\ObjectMapper\ObjectMapper;
use FivePercent\Component\ObjectMapper\Metadata\ObjectMetadata;

$strategyManager = StrategyManager::createDefault();

$annotationLoader = new AnnotationLoader(new AnnotationReader());
$metadataFactory = new MetadataFactory($annotationLoader);

$objectMapper = new ObjectMapper($metadataFactory, $strategyManager);

// Or create default object mapper
$objectMapper = ObjectMapper::createDefault(); // Used AnnotationLoader for load metadata

注意:目前仅支持注解元数据加载器。

配置并创建实例后,您可以使用 ObjectMapper 的映射功能。

映射示例对象

use FivePercent\Component\ObjectMapper\Annotation\Object;
use FivePercent\Component\ObjectMapper\Annotation\Property;

/**
 * @Object()
 */
class MyClass
{
    /**
     * @Property()
     */
    public $id;

    /**
     * @Property()
     */
    public $name;
}

并映射数组数据

$object = new MyClass();
$objectMapper->map($object, [
    'id' => 1,
    'name' => 'Foo Bar'
]);

如果您想映射对象中的所有属性,可以为 @Object 设置属性 allProperties,这表示从类中加载所有属性。

use FivePercent\Component\ObjectMapper\Annotation\Object;

/**
 * @Object(allProperties=true)
 */
class MyClass
{
    public $id;
    public $name;
}

如果数组的键不等于对象的属性名,可以为 @Property 设置属性 fieldName

use FivePercent\Component\ObjectMapper\Annotation\Object;
use FivePercent\Component\ObjectMapper\Annotation\Property;

/**
 * @Object()
 */
class MyClass
{
    /**
     * @Property()
     */
    public $id;

    /**
     * @Property(fieldName="first_name")
     */
    public $firstName;
}

$object = new MyClass();
$objectMapper->map($object, [
    'id' => 1,
    'first_name' => 'Foo Bar'
]);

递归映射

您可以对数据进行递归映射到对象。

使用简单对象

use FivePercent\Component\ObjectMapper\Annotation\Object;
use FivePercent\Component\ObjectMapper\Annotation\Property;

class MyClass
{
    /**
     * @DataMapping\Property(class="Tag")
     */
    protected $tag;
}

/**
 * @DataMapping\Object(allProperties=true)
 */
class Tag
{
    protected $name;
}

$object = new MyClass();
$objectMapper->map($object, [
    'tag' => [
        'name' => 'Foo Bar'
    ]
]);

使用集合

use FivePercent\Component\ObjectMapper\Annotation\Object;
use FivePercent\Component\ObjectMapper\Annotation\Property;

class MyClass
{
    /**
     * @DataMapping\Property(collection=true, class="Tag")
     */
    protected $tag;
}

/**
 * @DataMapping\Object(allProperties=true)
 */
class Tag
{
    protected $name;
}

$object = new MyClass();
$objectMapper->map($object, [
    'tag' => [
        ['name' => 'Foo Bar'],
        ['name' => 'Bar Foo']
    ]
]);

如果需要,您可以设置集合类,将其设置为 collection 属性 ``collection="MyCollectionClass"` 所有键都将保存。