轨道体/实体合并

此包已被废弃,不再维护。作者建议使用 symfony/serializer 包。

将数组合并到您的对象实体中

v0.6.0 2017-07-06 12:12 UTC

This package is auto-updated.

Last update: 2021-02-25 16:03:48 UTC


README

⚠️ 此包未维护。请寻找更好的解决方案,如序列化器。

实体合并器

PHP应用的实体/对象合并器。

安装

使用 Composer 安装,它是您能拥有的最佳包管理器

composer require orbitale/entity-merger

要求

基本用法

注意: 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"