shureban / laravel-object-mapper
Laravel SDK 对象数据映射
1.2.0
2024-01-11 10:58 UTC
Requires
- php: ^8.1
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
数组