exeu/objectmerger

PHP 对象合并器。

0.3.0 2014-07-18 13:14 UTC

This package is auto-updated.

Last update: 2024-09-20 04:28:59 UTC


README

#Objectmerger

使用这个库,您可以将相同类型的两个对象合并。

这个库正在建设中。事情将会改变。

构建状态

Build Status

安装

Composer

在现有的 composer.json 中添加 objectmerger,或者创建一个新的 composer.json

{
    "require": {
        "exeu/objectmerger": "dev-master"
    }
}

现在运行以下命令让 composer 下载库:

$ php composer.phar install

Composer 将自动生成自动加载文件。所以您只需要包含这个文件。通常它位于 vendor 目录下,文件名为 autoload.php

##基本用法

###添加可合并元数据

####注解

<?php
namespace Acme;

use Exeu\ObjectMerger\Annotation as Exeu;

class Foo
{
    /**
     * @Exeu\Mergeable(type="string")
     */
    private $bar;
    
    public function setBar($bar) { $this->bar = $bar; }
    public function getBar() { return $this->bar; }
}

####YAML 尚未实现。如果您想贡献 -> 欢迎您分支这个库。

####XML 尚未实现。如果您想贡献 -> 欢迎您分支这个库。

###使用合并器

<?php

use Doctrine\Common\Annotations\AnnotationReader;
use Exeu\ObjectMerger\Accessor\PropertyAccessorRegistry;
use Exeu\ObjectMerger\EventDispatcher\EventDispatcher;
use Exeu\ObjectMerger\MergeHandler\MergeHandlerRegistry;
use Exeu\ObjectMerger\Metadata\Driver\AnnotationDriver;
use Exeu\ObjectMerger\ObjectMerger;
use Metadata\MetadataFactory;

// ...

$reader  = new AnnotationReader();
$driver  = new AnnotationDriver($reader);

$metadataFactory            = new MetadataFactory($driver);
$eventDispatcher            = new EventDispatcher();
$propertyAccessorRegistry   = new PropertyAccessorRegistry();
$mergeHanlderRegistry       = new MergeHandlerRegistry();

$objectMerger = new ObjectMerger($metadataFactory, $propertyAccessorRegistry, $mergeHanlderRegistry, $eventDispatcher);

// ...

$objectA = new \Acme\Foo();
$objectA->setBar('baz');

$objectB = new \Acme\Foo();
$objectB->setBar('overwritten-baz');

$objectMerger->merge($objectA, $objectB);

echo $objectB->getBar(); // will return 'baz'

##注册自定义处理器

自定义处理器是一个自己创建的合并处理器。创建一个 MergeHandler 让您能够控制属性是如何被合并的。内置了一些默认的合并处理器,如 (string, int, object, 等.)。现在我们到了创建一个新的合并处理器的时候。首先,您必须实现 MergeHandlerInterface。

<?php

namespace Acme\Demo\Handler;

use Exeu\ObjectMerger\MergeHandlerInterface;
use Exeu\ObjectMerger\Metadata\PropertyMetadata;
use Exeu\ObjectMerger\MergeContext;

class CustomHandler implements MergeHandlerInterface
{
    public function merge(PropertyMetadata $propertyMetadata, MergeContext $context)
    {
       // DO YOUR AWESOME STUFF HERE
    }


    public function getType()
    {
        return 'MyCustomHandler';
    }
}

在编写完您的处理器后,您可以在 MergeHandlerRegistry 中简单注册它。

<?php
// bootrap as shown above.

$customMergeHandler   = new \Acme\Demo\Handler\CustomHandler();
$mergeHanlderRegistry = new MergeHandlerRegistry();
$mergeHandlerRegistry->addMergeHandler($customMergeHandler);


$objectMerger = new ObjectMerger($metadataFactory, $propertyAccessorRegistry, $mergeHanlderRegistry, $eventDispatcher);

// bootstrap as shown above.

在将 MergeHandler附加到注册表后,它就准备好使用了。只需将 MergeAnnotation 添加到您的属性即可。

<?php
namespace Acme;

use Exeu\ObjectMerger\Annotation as Exeu;

class Foo
{
    /**
     * @Exeu\Mergeable(type="MyCustomHandler")
     */
    private $bar;
    
    
    // ...
}