carlosv2/dumbsmart-repositories

将文档存储到各自仓库的简化层

1.2.0 2018-06-01 11:29 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:47:29 UTC


README

此项目提供了一个层,位于您的项目与一组假仓库之间,以便每个文档都存储在自己的仓库中,而不管它是否作为另一个对象的关联持久化。此层设计用于测试环境或低数据访问级别的应用程序。不建议在生产环境中使用此项目。

License Build Status SensioLabsInsight

为什么?

当使用假仓库时,通常使用诸如 serializejson_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);