brandembassy/unit-of-work

1.3 2023-04-18 11:43 UTC

This package is auto-updated.

Last update: 2024-08-26 15:23:42 UTC


README

这个库提供了后处理工具。让我们通过一个例子来解释

您有一些领域实体(让我们称它为 Document)。在您的逻辑中,您做了很多不同的更改和数据转换,并希望将这些更改持久化,例如保存到ElasticSearch数据库。

问题是如果您在更改后立即保存,可能会导致多次写入。

通过使用这个库,您可以跟踪所有这些更改并将它们合并。

function doBoringStuff(Document $document): UnitOfWork {
	$document->changeBoringStuff();
	$unitOfWork = new UnitOfWork();
	$unitOfWork->registerOperation(new SaveDocumentOperation($document));
	
	return $unitOfWork;
}

function doFunkyStuff(Document $document): UnitOfWork {
	$document->changeFunkyStuff();
	$unitOfWork = new UnitOfWork();
	$unitOfWork->registerOperation(new SaveDocumentOperation($document));
	
	return $unitOfWork; 
}


$boringWork = doBoringStuff($document);
$funkyWork = doFunkyStuff($document)
$unitOfWork = $boringWork->concatenate($funkyWork);

// Every Processor has its own Accessor for Dependecy Injection Container
$accessors = [new SaveDocumentOperationProcessorAccessor()]; 

$naiveExecutor = new NaiveUnitOfWorkExecutor($accesors);
$executor = new ReducingUnitOfWorkExecutor($naiveExecutor); // Decorator pattern to separate merging logic

// And document will be saved only once if your SaveDocumentOperation is implemented
// as mergable. See: `MergeableOperation` as example.
$executor->execute($unitOfWork); 

在Nette依赖注入容器内使用的示例

unitOfWorkExecutor: BrandEmbassy\UnitOfWork\ReducingUnitOfWorkExecutor(
    BrandEmbassy\UnitOfWork\NaiveUnitOfWorkExecutor([@saveDocumentOperationProcessorAccessor])
)

- Foo\Bar\SaveDocumentOperationProcessor
saveDocumentOperationProcessorAccessor: Foo\Bar\SaveDocumentOperationProcessorAccessor