rekalogika / mapper
PHP 和 Symfony 的对象映射器。将一个对象映射到另一个对象。主要用于将实体映射到 DTO 并反向映射。
v1.8.0
2024-09-22 12:37 UTC
Requires
- php: >=8.2
- doctrine/collections: ^2.1
- phpdocumentor/reflection-docblock: ^5.3
- phpstan/phpdoc-parser: ^1.25
- psr/container: ^2.0
- symfony/cache: ^6.4 || ^7.0
- symfony/clock: ^6.4 || ^7.0
- symfony/config: ^6.4 || ^7.0
- symfony/console: ^6.4 || ^7.0
- symfony/dependency-injection: ^6.4.11 || ^6.5 || ^7.1.4 || ^7.2
- symfony/property-access: ^6.4 || ^7.0
- symfony/property-info: 6.4.0 - 6.4.8 || ^6.4.10 || ^6.5 || 7.0.0 - 7.0.8 || 7.1.0 - 7.1.1 || ^7.1.3 || ^7.2
- symfony/serializer: ^6.4 || ^7.0
- symfony/service-contracts: ^3.0
- symfony/var-exporter: ^6.4.1 || ^6.5 || ^7.0.1 || ^7.1
Requires (Dev)
- bnf/phpstan-psr-container: ^1.0
- brick/money: ^0.9.0
- dave-liddament/php-language-extensions: ^0.6.0
- dave-liddament/phpstan-php-language-extensions: ^0.5.0
- doctrine/doctrine-bundle: ^2.10
- doctrine/orm: ^2.14 || ^3.0
- doctrine/persistence: ^3.1
- ekino/phpstan-banned-code: ^2.1
- phpstan/phpstan: 1.12.2 || ^1.12.4 || ^1.13
- phpstan/phpstan-deprecation-rules: ^1.1
- phpstan/phpstan-phpunit: ^1.3
- phpunit/phpunit: ^10.5
- psalm/plugin-phpunit: ^0.19.0
- psr/log: ^3.0
- ramsey/uuid: ^3.0 || ^4.0
- rector/rector: ^1.2
- symfony/framework-bundle: ^6.4 || ^7.0
- symfony/http-kernel: ^6.4 || ^7.0
- symfony/polyfill-php83: ^1.30
- symfony/runtime: ^6.4 || ^7.0
- symfony/uid: ^6.4 || ^7.0
- symfony/var-dumper: ^6.4 || ^7.0
- symfony/yaml: ^6.4 || ^7.0
- tomasvotruba/unused-public: ^0.4.0
- twig/twig: ^2.12|^3.0
- vimeo/psalm: ^5.26
- dev-main
- v1.8.0
- v1.7.0
- v1.6.1
- v1.6.0
- v1.5.7
- v1.5.6
- v1.5.5
- v1.5.4
- v1.5.3
- v1.5.2
- v1.5.1
- v1.5.0
- v1.4.0
- v1.3.0
- v1.2.0
- v1.1.3
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.0
- v0.10.2
- v0.10.1
- v0.10.0
- v0.9.1
- v0.9.0
- v0.8.1
- v0.8.0
- v0.7.3
- v0.7.2
- v0.7.1
- v0.7.0
- v0.6.7
- v0.6.6
- v0.6.5
- v0.6.4
- v0.6.3
- v0.6.2
- v0.6.1
- 0.6.0
- v0.5.26
- v0.5.25
- v0.5.23
- v0.5.22
- v0.5.21
- v0.5.20
- v0.5.19
- v0.5.18
- v0.5.17
- v0.5.16
- v0.5.15
- v0.5.14
- v0.5.13
- v0.5.12
- v0.5.11
- v0.5.10
- v0.5.9
- v0.5.8
- v0.5.7
- v0.5.6
- v0.5.5
- v0.5.4
- v0.5.3
- v0.5.2
- v0.5.1
- dev-chore/rector2
- dev-chore/rector
- dev-feat/collection-lazy
- dev-style/naming
- dev-feat/remover-allowdelete
- dev-fix/map-class-inheritance
- dev-refactor/remove
- dev-refactor/property-mapping
- dev-feat/map-reverse
- dev-feat/map-subclassing
- dev-feat/map
- dev-perf/guess
- dev-feat/attach-attribute-to-getter
- dev-feat/magic-set
- dev-feat/magic-get
- dev-feat/error-handler-dynamic-property
- dev-fix/unset-source-to-not-null-target
- dev-fix/dynamic-property-2
- dev-feat/property-mapper-union-types
- dev-feat/union-types-object-mapper
- dev-test/modernize
- dev-deps/property-info
- dev-fix/issue92
- dev-chore/cs-fix
- dev-fix/key-transformation
- dev-fix/bundle-deprecation
- dev-refactor/static-autoloader
- dev-refactor/proxy
- dev-proxy-factory
- dev-mapping-engine-experiment
- dev-readwriteinfo
- dev-reverse-inheritance
This package is auto-updated.
Last update: 2024-09-23 06:02:57 UTC
README
rekalogika/mapper
是 PHP 和 Symfony 的对象映射器,也常被称为自动映射器。它将一个对象映射到另一个对象。主要用于将实体映射到 DTO,但也适用于其他映射目的。它简化了对象到对象,甚至对象图到对象图的映射复杂度。
完整文档可在 rekalogika.dev/mapper 查看。
安装
composer require rekalogika/mapper
使用
use App\Entity\Book; use Rekalogika\Mapper\MapperInterface; // map a single object: /** @var MapperInterface $mapper */ /** @var Book $book */ $result = $mapper->map($book, BookDto::class); // map a single object to an existing object: $bookDto = new BookDto(); $mapper->map($book, $bookDto); // map an iterable of objects: /** @var IterableMapperInterface $iterableMapper */ /** @var iterable<Book> $books */ $bookDtos = $iterableMapper->mapIterable($books, BookDto::class);
为什么使用映射器?
我们为什么要使用映射器来节省几个按键,而不是简单地使用像这样简单的东西?
class BookDto { public static function create(Book $book): self { $dto = new self(); // ... return $dto; } }
每个人在某个时刻都会有这样的想法。然而,随着项目的增长,目标类(DTO)可能会开始相互引用,形成一个丰富的对象图。你的代码将开始出现许多特殊情况,不再是你想象的那样简单。它变得难以维护,最终迫使你坐下来尝试解决问题。当你(如果)成功设计出解决方案时,你最终会得到一个类似于映射框架的东西。
映射可以是简单的,但也可以变得非常复杂。映射器的创建是为了处理这种复杂性,而不仅仅是为了节省几个按键。
特性
通用
- 自动列出源和目标属性的列表,检测其类型,并相应地映射它们。
- 从 PHP 类型声明和 PHPDoc 注释中读取类型,包括嵌套对象的类型。
- 不会尝试绕过你的类约束。只从公共属性、获取器和设置器读取,只写入公共属性、获取器和设置器。不会在没有构造函数的情况下实例化对象。
- 构造函数初始化。
- 处理嵌套对象。
- 处理递归和循环引用。
- 支持继承。使用继承映射属性将映射到抽象类和接口。
- 映射到和从
stdClass
,扩展stdClass
的对象,以及其他具有动态属性的对象(#[AllowDynamicProperties]
)。 - 将对象映射到数组,反之亦然。
- 支持第三方对象:Doctrine 集合、Symfony Uid、Ramsey UUID。
自定义映射
- 使用自定义属性映射器覆盖特定属性的映射。
- 使用自定义对象映射器覆盖两个特定类之间的映射。
- 通过创建新的转换器或装饰现有的转换器来扩展映射器。
- 除了使用类名外,还使用转换器中的属性匹配类。
- 预设映射。提供一张预定的映射表,映射器可以使用。
对象懒加载
- 如果可能,目标对象将懒加载。映射将在目标对象被访问时进行,如果从未被访问,则永远不会进行映射。
- 在源端尝试检测标识符属性。这些属性将被贪婪地映射到目标端,因为它们不应该触发源端的激活。以API Platform为例,它可以在不引起Doctrine激活整个对象图的情况下生成IRI。
数组和类似数组的对象
- 处理
array
或类似数组的对象的映射。 - 处理目标端的添加器和移除方法。
- 处理类似数组对象中的非字符串和非整数字符键,包括
SplObjectStorage
。 - 如果它们在源端不存在,可以选择从目标端删除现有项目。
类似数组的延迟加载
- 如果目标被类型提示为
ArrayAccess
、Traversable
或CollectionInterface
,则进行延迟加载。目标将在访问之前不会迭代源对象,或者在从未访问过时永远不会迭代。 - 流映射。在迭代时将源成员映射到目标端,这可能会消耗更少的内存。
- 在延迟加载的情况下,如果源是
Countable
,则目标也将是Countable
。对于额外的延迟加载Doctrine集合,消费者可以在不引起源端完全激活的情况下计算目标。
开发体验(DX)
- 有用的异常消息。
- 用于调试的控制台命令。
- 数据收集器和分析器集成。
- 从头开始使用PHP 8、严格类型以及PHPStan和Psalm的最大级别编码。
待办事项列表
- 读取和写入私有属性的选项。
- 将迁移引擎迁移到
symfony/type-info
。 - 自动检测静态工厂方法。
- 使用我们自己的接口用于代理对象。
- 改进非框架使用。
- 从用户提供的类列表中在构建时预热代理。
文档
许可证
MIT