轨道体 / 实体合并
Requires
- php: ^5.5|^7.0
- doctrine/orm: ^2.2.3
- symfony/serializer: ^2.3|^3.0
Requires (Dev)
- jms/serializer: ~0.16
- phpunit/phpunit: ^4.3|^5.0
- satooshi/php-coveralls: ~0.6
- symfony/validator: ^2.8|^3.0
Suggests
- jms/serializer: To merge entities with JMS serializer instead of Symfony one
README
⚠️ 此包未维护。请寻找更好的解决方案,如序列化器。
实体合并器
PHP应用的实体/对象合并器。
安装
使用 Composer 安装,它是您能拥有的最佳包管理器
composer require orbitale/entity-merger
要求
- PHP 5.3.3 或更高版本
- 任何 Doctrine
ObjectManager
(可选) - Symfony 序列化器(可选)
- JMS 序列化器(可选)
基本用法
注意: EntityMerger
只与 映射对象 一起工作。属性必须存在,并且它不能使用魔术方法来获取数据。
use Orbitale\Component\EntityMerger\EntityMerger; $merger = new EntityMerger(); $object = new Object(); $object->setField(null); $postedDatas = array('field' => 'value'); $merger->merge($object, $postedDatas); echo $object->getField(); // Shows "value"
使用 Doctrine ORM ObjectManager
EntityMerger
接受一个 Doctrine\ORM\ObjectManager
作为第一个参数,例如 EntityManager
等。这在使用 ORM 映射实体时,可以通过自动使用 Doctrine Metadatas 来检测属性类型,从而实现更好的深度合并。如果您在应用程序中使用 Doctrine 使用 EntityMerger
,强烈建议注入 ObjectManager
以使用您的映射作为每个类属性的类型参考。
如果没有使用 ObjectManager
,则 EntityMerger
将使用其自己的元数据管理器执行自己的检查,但显然不如 Doctrine 的性能好,因为它不能假设您正在尝试合并一个实体。它将基于 PHPDoc、类导入和默认参数进行检查,因此如果您不使用 ObjectManager
,请确保您的类中的 PHPDoc 写得完美!
使用序列化器
EntityMerger
接受一个 Serializer
作为第二个参数。它可以同时使用本地的 Symfony 序列化器 和强大的 JMS 序列化器。
注意: 如果您正在使用 Symfony <2.5 并且仍然想使用序列化器,那么您必须切换到 JMS 的一个,或者您可能会因为缺少 PropertyNormalizer
类而有意外行为。
使用序列化器可以通过将 dataObject
参数序列化为数组,并将其用作合并对象/实体的值来合并两个对象。
注意: 当然,您可以在合并过程中使用自己的序列化方法将 dataObject
注入为数组。
高级用法
在第一个对象中合并两个对象(必须使用任何序列化器)
use Orbitale\Component\EntityMerger\EntityMerger; $merger = new EntityMerger(null, $serializer); $baseObject = new Object; $baseObject->field = null; $anotherObject = new Object(); $anotherObject->field = 'value'; $merger->merge($baseObject, $anotherObject); echo $baseObject->field; // Shows "value"