exeu / objectmerger
PHP 对象合并器。
0.3.0
2014-07-18 13:14 UTC
Requires
- php: >=5.3.0
- doctrine/common: v2.4.1
- jms/metadata: 1.5.0
Requires (Dev)
- phpunit/phpunit: 4.0.*
This package is auto-updated.
Last update: 2024-09-20 04:28:59 UTC
README
#Objectmerger
使用这个库,您可以将相同类型的两个对象合并。
这个库正在建设中。事情将会改变。
构建状态
安装
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; // ... }