brandembassy / unit-of-work
1.3
2023-04-18 11:43 UTC
Requires
- php: ^7.4 || >=8.1
- beberlei/assert: ^3.2
- psr/log: ^1.1
Requires (Dev)
- brandembassy/coding-standard: 10.0.0-beta
- mockery/mockery: ^1.5.1
- nette/utils: ^2.4 || ^3.0
- phpunit/phpunit: ^9.6.6
- roave/security-advisories: dev-latest
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