reusify / dto
php dto
v1.0.2
2025-10-29 10:59 UTC
Requires
- php: >=7.4
- ext-json: *
- ext-mbstring: *
This package is not auto-updated.
Last update: 2026-01-07 11:49:24 UTC
README
Reusify DTO 是一个轻量级 PHP DTO(Data Transfer Object)库,旨在简化数据对象的封装与复用。 它可以将数组或对象快速映射到 DTO,并支持字段映射、递归转数组、JSON 序列化等功能,减少重复写类、函数和 setter 的工作。
安装
通过 Composer 安装:
composer require reusify/dto
PHP 版本要求 >= 7.4。
特性
- 批量赋值(支持数组和对象)
- 字段映射(支持
$map映射 DTO 属性) - 支持私有/保护属性赋值
- 可递归转换为数组
- JSON 序列化支持
- 支持
ArrayAccess、IteratorAggregate、Countable - 类型属性未初始化安全处理
使用示例
创建 DTO
<?php
require_once "../vendor/autoload.php";
use Reusify\Dto\BaseDto;
class UserDto extends BaseDto
{
public int $id;
public string $name;
public string $email;
public string $password;
}
$userDto = new UserDto([
'id' => 1,
]);
echo $userDto;
// 输出: {"id":1}
var_dump($userDto->toArray());
// 输出: ['id' => 1]
var_dump($userDto->toJson());
// 输出: {"id":1}
批量赋值和字段映射
$userDto = new UserDto([
'id' => 1,
'name' => 'test',
'email' => 'email',
'password' => 'password',
]);
class AdminDto extends BaseDto
{
public int $id;
public string $name;
public string $email;
public string $password;
}
// 普通复制
$adminDto = new AdminDto($userDto);
echo $adminDto;
// 输出: {"id":1,"name":"test","email":"email","password":"password"}
// 使用字段映射,将 UserDto 的 name 赋值到 AdminDto 的 email
$userDto2 = new UserDto([
'id' => 1,
'name' => 'test',
'email' => 'email',
]);
$adminDto1 = new AdminDto($userDto2, ['name' => 'email']);
echo $adminDto1;
// 输出: {"id":1,"name":"test","email":"test","password":""}
fill 方法规则
BaseDto::fill($data, $map) 支持两种方式:
- 直接同名赋值
$data = ['id' => 1, 'name' => 'Tom'];
$dto->fill($data);
// DTO 属性 id 和 name 会被赋值
- 字段映射
$map = ['dtoPropertyName' => 'dataKey'];
$dto->fill($data, $map);
// DTO 属性 dtoPropertyName 会被赋值为 $data['dataKey']
- 支持
$data为数组或对象(包括IteratorAggregate) $map的赋值优先级高于同名字段- 会抛出
LogicException如果$data缺少映射的 key
转数组和 JSON
$array = $dto->toArray(); // 递归 DTO 转数组
$json = $dto->toJson(); // JSON 字符串
- 支持嵌套 DTO 对象
- 数组中的对象也会递归转换
支持接口
ArrayAccess:可像数组访问 DTO 属性,但默认只读$dto['id']; // 访问 $dto['id'] = 123; // 抛异常IteratorAggregate:可遍历 DTOforeach ($dto as $key => $value) { echo "$key => $value\n"; }Countable:可获取 DTO 属性数量count($dto);
示例:数组列提取
$array = [];
$array[] = $userDto;
$array[] = $userDto;
$r = array_column($array, 'id');
var_dump($r); // 输出: [1, 1]
注意事项
- PHP 7.4+ 类型属性未初始化时会被安全跳过
- DTO 构造函数默认调用
fill($data, $map),可传入初始值和映射 - Map 的 key 会覆盖原同名字段
总结
Reusify DTO 旨在让 PHP 开发者减少重复封装对象、函数和方法的工作,尤其适合在业务层频繁处理 DTO、API 响应或数据库映射场景。