carlosv2 / dumbsmart-repositories
将文档存储到各自仓库的简化层
1.2.0
2018-06-01 11:29 UTC
Requires
- php: ~5.3 || ~7.0
- carlosv2/communism: ^1.2
- everzet/persisted-objects: ~1.0
Requires (Dev)
- bossa/phpspec2-expect: ~1.0
- phpspec/phpspec: ~2.1
This package is not auto-updated.
Last update: 2024-09-14 18:47:29 UTC
README
此项目提供了一个层,位于您的项目与一组假仓库之间,以便每个文档都存储在自己的仓库中,而不管它是否作为另一个对象的关联持久化。此层设计用于测试环境或低数据访问级别的应用程序。不建议在生产环境中使用此项目。
为什么?
当使用假仓库时,通常使用诸如 serialize 或 json_encode 等函数来使数据易于持久化。使用这些方法的副作用是,相关的文档与父文档一起存储。因此,从其自己的仓库中查询此文档不会产生结果,而修改其数据意味着加载与必须修改的任何相关文档。这通常对小型项目来说不是问题,但对于数据复杂的大型项目,可能会出现不可预见的结果。
安装
使用以下命令安装
$ composer require --dev carlosv2/dumbsmart-repositories
用法
假设您有以下实体
class User { private $id; private $posts; public function __construct($id) { $this->id = $id; } public function getId() { return $this->id; } public function setPosts(array $posts) { $this->posts = $posts; } } class Post { private $id; public function __construct($id) { $this->id = $id; } public function getId() { return $this->id; } }
为了使用它们,您首先需要配置此层
// Configure the metadata $metadataManager = new MetadataManager(); $userMetadata = new Metadata(new AccessorObjectIdentifier('getId')); $userMetadata->setRelation(new OneToManyRelation('posts')); $metadataManager->addMetadata(User::class, $userMetadata); $postMetadata = new Metadata(new AccessorObjectIdentifier('getId')); $metadataManager->addMetadata(Post::class, $postMetadata); // Configure the repositories $repositoryManager = new RepositoryManager(); $repositoryManager->addRepository(User::class, new InMemoryRepository(new AccessorObjectIdentifier('getId'))); $repositoryManager->addRepository(Post::class, new InMemoryRepository(new AccessorObjectIdentifier('getId'))); // Create the persister object $transactionFactory = new TransactionFactory($metadataManager, $repositoryManager); $persister = new Persister($repositoryManager, $transactionFactory);
配置层后,您可以像这样开始使用它
$post1 = new Post(1); $post2 = new Post(2); $user = new User(1); $user->setPosts([$post1, $post2]); $persister->save($user); // This returns an object with same properties as $post2. However it does // not return same object because it has been serialized and unserialized $persister->findById(Post::class, 2);
如果您之前使用过 everzet/persisted-objects,则甚至不需要修改您的代码,只需修改构建仓库的方式即可。
// $persister is an instance of carlosV2\DumbsmartRepositories\Persister $persister = ... ; // FrontRepository implements Everzet\PersistedObjects\Repository $frontRepository = new FrontRepository($persister, YourVeryOwnClass::class); $repository = new YourVeryOwnClassRepository($frontRepository);