lexide/reposition

一个模块化的数据库抽象系统

2.0.1 2018-02-20 15:04 UTC

README

Build Status

一个模块化的数据库抽象系统,专注于性能和可用性

又一个DBAL?

嗯,是的,我同意PHP有太多的数据库抽象库,我自己也使用了很多。我总是发现的问题是它们似乎更关注添加更多功能,能够做任何事情,而不是我所想要的;一个易于使用的API,可以在需要高性能的情况下使用。

我是一名PHP开发者。我想处理对象和PHP代码,我使用的任何库都必须快速高效。我不想学习另一种查询语言,到处写注释(别提了)或者使用处理10,000条记录就会耗尽内存的系统。

Reposition被设计得既简洁又快速,无论是为其编写代码还是运行它。它处理了几乎所有繁琐的工作,让你可以专注于开发应用程序,而不是与查询纠缠或担心加载所有这些记录的性能成本。即使复杂的实体关系也可以轻松处理,唯一的要求是你事先知道你想加载或保存什么信息。

除此之外,Reposition是模块化的。API被设计为数据库无关,这意味着你可以更改数据库提供者,而无需更改任何存储库或模型。Reposition最初是为NoSQL数据库编写的,后来重构为与SQL一起使用,因此甚至可以在这两种类型的数据库之间进行切换(尽管每种类型的数据模式可能不兼容)。重点是,你拥有尽可能少的限制和灵活性。

安装

通常,你不会直接安装reposition;它是你选择的数据库提供者模块的要求。然而,如果你想创建一个模块,你可以通过composer安装

composer require lexide/reposition

{
  "require": {
    "lexide/reposition": "^1.0"
  }
}

Reposition模块遵循“单一责任”原则;模块应该只做一件事情,并且要做好。目前有两个Reposition模块

Reposition SQL正如其名,是一个模块,它使SQL数据库可以与Reposition一起使用。它在数据库上执行查询,使用由存储库类生成的令牌序列。它已与MySQL和PostgreSQL进行了测试,应该很容易适应其他SQL数据库版本。

Reposition Clay管理每个存储库中使用的实体。它生成每个存储库用于创建查询的实体元数据,并从查询返回的原始查询中创建实体。《Clay》是它使用的模型创建库的名称。

在大多数情况下,你将在使用Reposition的任何项目中包含这两个模块。然而,你可以使用任何复制每个部分功能解决方案,或者如果你喜欢,可以自己编写。

快速示例

这是一个Reposition存储库的示例

use Lexide\Reposition\Repository\AbstractRepository;

class ExampleRepository extends AbstractRepository
{
    protected $collectionName = "example_table"
}

...是的,没错。就这么简单。有了这个,你可以查找、筛选、保存和删除实体,而无需对存储库类进行任何进一步的修改。

可以通过在仓库类上创建新方法并使用查询构建器来创建自定义查询来编写更复杂的查询。可以通过重写 configureMetadata 方法并添加所需配置来定义实体之间的关系。

仓库管理

创建新仓库时需要四个对象:实体元数据用于向仓库提供其交互的实体信息,查询构建器允许仓库创建表示数据库查询的令牌序列,存储对象提供对数据库实现的访问,元数据提供程序允许仓库访问相关实体的元数据(例如在加载时创建连接或在保存时级联更新操作)

幸运的是,存在 RepositoryManager 以尽可能使此过程无缝。以下代码将为特定实体创建仓库

$repository = $repositoryManager->getRepositoryFor($entityOrEntityClassName);

仓库管理器可以手动创建,也可以通过依赖注入进行配置。仓库本身可以通过任何可以使用工厂服务的 DI 库进行依赖注入。以下是对 Syringe DI 库的示例

repository:
    class: RepositoryClassName
    factoryService: "@repositoryManager"
    factoryMethod: "getRepositoryFor"
    arguments:
        - EntityClassName

文档

更详细的文档可以在 readthedocs.org 找到。请注意,这还是一个进行中的工作。

致谢

由 Danny Smart(Downsider)和 Silktide Ltd 撰写