h69 / content-mapping
用于将内容从源系统映射到目标系统的微型框架,例如从 Propel 对象到 Solr 或从 Doctrine 实体到 ElasticSearch。
Requires
- php: >=5.5.0
Requires (Dev)
- phpunit/phpunit: ~4.0
- satooshi/php-coveralls: ~0.6
README
content-mapping 是用于将内容从源系统映射到目标系统的微型框架。例如,从 Propel 对象到 Solr、从 Doctrine 实体到 ElasticSearch 或从一个 XML 结构到另一个。它提供了接口以指导您的映射过程,并附带一些抽象实现辅助器或魔术实现。
注意!此存储库是 [webfactory/content-mapping] (https://github.com/webfactory/content-mapping) 的分支,旨在只有一个类型的适配器(而不是源适配器和目标适配器),并且具有处理索引而不是同步的能力。索引与同步的区别在于,索引返回已创建、更新或删除的项目队列,而不是按 id 排序的所有项目。
安装
通过运行以下命令将此 content-mapping 的长期分支作为依赖项添加(请参阅 https://getcomposer.org.cn/)
php composer.phar require h69/content-mapping
然后运行
php composer.phar install
概念
content-mapping 流程基于四个部分:同步器或索引器,它需要一个源适配器、目标适配器和回调函数来将源结构映射到目标结构。
同步器 入口点是 Synchronizer->synchronize()
:在那里,过程从 SourceAdapter->getObjectsOrderedById()
获取一个迭代器,以及从 DestinationAdapter->getObjectsOrderedById()
获取一个迭代器,并比较每个迭代器中的对象。在比较过程中(同步器),它删除过时的对象(DestinationAdapter->delete()
)、存储新对象(DestinationAdapter->createObject()
)并在目标系统中更新现有对象(回调函数)。
索引器 入口点是 Indexer->index()
:在那里,过程从 SourceAdapter->getObjectsOrderedById()
获取一个迭代器并读取每个对象的状况(SourceAdapter->statusOf()
)。在索引过程中,返回的对象状况定义了该对象将被创建(DestinationAdapter->createObject()
)、更新(回调函数)还是删除(DestinationAdapter->delete()
)。
钩子 DestinationAdapter->updated()
和 DestinationAdapter->commit()
仅用于外部变更跟踪的钩子,表示对象已被更新或两个迭代器都已处理,即变更可以被持久化。
用法
要构建一个 Synchronizer
,您需要为适配器(源和目标)提供两个实现,并有一个回调函数将属性从源对象映射到目标对象。您可以在 h69/content-mapping-* 中找到抽象模板和现成的通用适配器实现,或者将 webfactory/content-mapping-* 中的一个适配器修改以与这个分支的更新接口一起工作。映射器通常对您的项目非常具体,因此您可能希望在自己的应用程序中实现它。
use H69\ContentMapping\Synchronizer; use H69\ContentMapping\Mapper\Result; $sourceAdapter = ...; // see the readme of the corresponding package on how to construct it $destinationAdapter = ...; // see the readme of the corresponding package on how to construct it $typeToSynchronize = 'pages'; $synchronizer = new Synchronizer($sourceAdapter, $destinationAdapter); $synchronizer->synchronize($typeToSynchronize, function($objectA, $objectB){ ... //return Result::unchanged(); return Result::changed($updatedObjectB); });
要构建一个Indexer
,你需要为Adapter
(源和目标)提供两个实现,以及一个回调函数来将属性从源映射到目标对象。请参阅h69/content-mapping-*或webfactory/content-mapping-*中的抽象模板和可用的通用Adapter实现。为了与这个分支的更新接口兼容,你可能需要修改其中一个。通常,Mapper对于你的项目来说非常具体,因此你可能会希望在应用程序中实现它。
use H69\ContentMapping\Indexer; use H69\ContentMapping\Mapper\Result; $sourceAdapter = ...; // see the readme of the corresponding package on how to construct it $destinationAdapter = ...; // see the readme of the corresponding package on how to construct it $typeToIndex = 'pages'; $indexer = new Indexer($sourceAdapter, $destinationAdapter); $indexer->index($typeToSynchronize, function($objectA, $objectB){ ... //return Result::unchanged(); return Result::changed($updatedObjectB); });
致谢、版权和许可证
该项目/分支始于webfactory GmbH,波恩,并由以下人员进一步开发:
版权所有 2016。代码在MIT许可证下发布。