shureban/laravel-object-mapper

Laravel SDK 对象数据映射

安装: 2 123

依赖关系: 2

建议者: 0

安全性: 0

星标: 3

关注者: 1

分支: 1

开放问题: 2

类型:laravel-package

1.2.0 2024-01-11 10:58 UTC

This package is auto-updated.

Last update: 2024-09-11 12:15:48 UTC


README

安装

使用以下命令通过 composer 安装此包

composer require shureban/laravel-object-mapper

将以下类添加到 config/app.php 中的 providers 数组

Shureban\LaravelObjectMapper\ObjectMapperServiceProvider::class,

您还可以发布配置文件以更改实现(例如,将接口映射到特定类)。

php artisan vendor:publish --provider="Shureban\LaravelObjectMapper\ObjectMapperServiceProvider"

如何使用

您有三种方式使用 ObjectMapper

继承

您映射的对象(DTO)必须继承自 \Shureban\LaravelObjectMapper\MappableObject

class User extends MappableObject
{
    public int $id; 
}

$user1 = (new User())->mapFromJson('{"id": 10}');
$user2 = (new User())->mapFromArray(['id' => 10]);
$user3 = (new User())->mapFromRequest($formRequest);

使用 trait

您映射的对象(DTO)必须使用 \Shureban\LaravelObjectMapper\MappableTrait

class User
{
    use MappableTrait;

    public int $id; 
}

$user1 = (new User())->mapFromJson('{"id": 10}');
$user2 = (new User())->mapFromArray(['id' => 10]);
$user3 = (new User())->mapFromRequest($formRequest);

委托映射到 ObjectMapper

class User {
    public int $id; 
}

$user1 = (new ObjectMapper(new User()))->mapFromJson('{"id": 10}');
$user2 = (new ObjectMapper(new User()))->mapFromArray(['id' => 10]);
$user3 = (new ObjectMapper(new User()))->mapFromRequest($formRequest);

可映射情况

以下是一些您可以将数据映射到对象中的情况

简单类型

  • mixed
  • string
  • bool, boolean
  • int, integer
  • double, float
  • array
  • object

Box 类型

  • Carbon
  • DateTime
  • Collection

自定义类型

  • CustomClass
  • Enum
  • Eloquent

类型数组

这种映射类型可能只能通过 phpDoc 标注来实现

  • int[]
  • int[][]
  • DateTime[]
  • CustomClass[]

特殊情况

构造函数

如果您的类型对象有 1 个必需参数且值不是数组,ObjectMapper 将通过构造函数调用创建该类型的实例。如果您的类型对象有 0 个或多个必需参数,它将抛出 WrongConstructorParametersNumberException 异常

正确情况

class User
{
    public int $id;
    
    public function __construct(int $id) {
        $this->id = $id;
    } 
}

错误情况

class User
{
    public int    $id;
    public string $name;
    
    public function __construct(int $id, string $name) {
        $this->id   = $id;
        $this->name = $name;
    } 
}

PhpDoc

PhpDoc 类型提示比主类型具有更高的优先级。

class User
{
    /**
    * @var int 
    */
    public int $id; 
    /**
    * @var DateTime 
    */
    public $dateOfBirthday; 
    /**
    * @var Address[]
    */
    public array $addresses; 
}

设置器

如果您想实现自己的逻辑来设置值,您可以在映射对象中放置设置器方法。此设置器应从 set 字符开始,并使用驼峰命名法。

class User
{
    public string   $id; 
    public DateTime $dateOfBirthday;
    
    public function setId(int $id, array $rawData = []): void 
    {
        $this->id = Hash::make($id);
    }
    
    public function setDateOfBirthday(string $dateOfBirthday, array $rawData = []): void 
    {
        $this->dateOfBirthday = new DateTime($dateOfBirthday);
    }
}

$user = (new ObjectMapper(new User()))->mapFromArray(['id' => 10, 'dateOfBirthday' => '1991-01-01']);

echo $user->id; // $2y$10$XqHrk0oXa7.9AihthdVxW.dd637zj9EhlTJX0eUEKiV61dbs7a7ZO
echo $user->dateOfBirthday->format('Y'); // 1991

有关第二个参数 $rawData 的说明。此参数的值取决于选择的映射方法

  • mapFromJson - $rawData 将是 JSON
  • mapFromArray - $rawData 将是 Array
  • mapFromRequest - $rawData 将是 FormRequest 对象

只读参数

只读参数将始终被跳过

class User
{
    public readonly int $id; 
}

$user = (new ObjectMapper(new User()))->mapFromArray(['id' => 10]);

echo $user->id; // 0

配置重写

object_mapper.php 配置文件中已列出所有可映射类型类。您有机会重写映射流程或实现自己的流程。

如果您需要创建自己的类型映射,请按照以下方式操作

  • 创建一个继承自 \Shureban\LaravelObjectMapper\Types\Type 的类
  • 将您的类型放入配置文件中的 type -> box 数组