dertechie/datamapping

Der Techie 数据映射库,提供一致的方式来处理数据映射。

dev-master 2020-11-26 19:05 UTC

This package is auto-updated.

Last update: 2024-09-27 03:32:07 UTC


README

在现代PHP应用程序中,通常需要处理数据映射。许多应用程序在其模型/实体上使用类方法,如fromArrayfromXXX。这对于同一上下文中的内置类型(如数组或对象)可能有效。但一旦有人尝试从上下文之外的对象进行映射,事情就会变得混乱。

这个库提供了一个干净且解耦的方式来处理数据映射。

安装

首选的安装方法是使用Composer。以下命令将添加适当的依赖项到您的composer.json文件中

composer require dertechie/datamapping

使用库

假设我们有一个简单的对象,我们想要映射

<?php

namespace DerTechie\Entities;

class MyObject
{
    use MappableTrait;

    private string $id;

    private string $name;

    /**
     * @return string
     */
    public function getId(): string
    {
        return $this->id;
    }

    /**
     * @param string $id
     */
    public function setId(string $id): void
    {
        $this->id = $id;
    }

    /**
     * @return string
     */
    public function getName(): string
    {
        return $this->name;
    }

    /**
     * @param string $name
     */
    public function setName(string $name): void
    {
        $this->name = $name;
    }
}

要为此对象启用映射,我们只需将其添加到MappableTrait中。这将为对象添加from方法。

为了映射对象,我们需要一个处理所有映射的Mapper类。

<?php

namespace DerTechie\Mappers;

use DerTechie\DataMapping\AbstractMapper;
use DerTechie\Entities\MyObject;

class MyObjectMapper extends AbstractMapper
{
    public static function getType(): string
    {
        return MyObject::class;
    }

    public function fromArray(array $source): MyObject
    {
        $obj = new MyObject();

        $obj->setId($source['id']);
        $obj->setName($source['name']);

        return $obj;
    }

    public function fromCreateMyObjectRequest(CreateMyObjectRequest $request): MyObject
    {
        $obj = new MyObject();
        
        $obj->setId($request->input('id'));
        $obj->setName($request->input('name'));
  
        return $obj;
    }

    public function getMappings(): array
    {
        return [
            new Mapping('array', [$this, 'fromArray']),
            new Mapping(CreateMyObjectRequest::class, [$this, 'fromCreateMyObjectRequest'])
        ];
    }
}

这里的关键部分是类方法getType()和方法getMappings()getType()定义了这个Mapper负责映射到的类型。getMappings()方法期望返回一个可用的映射数组。第一个参数定义了这个映射映射到的类型,第二个参数定义了用于映射的回调函数。

要使用映射器,需要将其注册。为此,只需调用

MapperRegistry::register(MyObjectMapper::class)

现在,您可以使用方便的from方法在您的对象上映射它:MyObject::from(['id' => '1', 'name' => 'Foo']);