nilportugues/mongodb-repository

MongoDB 存储库实现

3.1.0 2016-08-09 21:46 UTC

This package is not auto-updated.

Last update: 2024-09-14 17:59:03 UTC


README

PHP7 Tested Build Status SensioLabsInsight Latest Stable Version Total Downloads License Donate

MongoDB 存储库库旨在减少编写存储库所需的时间。MongoDB 存储库使用 nilportugues/repository 作为基础,使用 mongodb/mongodb

创建这个库的动机是在多个项目中重复编写 MongoDB 以执行相同操作时的无聊。

MongoDB 存储库允许您轻松获取、分页和操作数据,而无需添加开销并遵循良好实践。

目录

功能

  • 从一开始就使用存储库模式。
  • 从开始就提供所有操作。
    • 使用 PHP 对象搜索存储库。
    • 无需编写 MongoDB 进行基本操作。
    • 可以使用 Filter 对象进行过滤。
    • 可以使用 Fields 对象获取特定字段。
    • 可以使用 Page 和 Pageable 对象解决分页问题。
  • 可以使用 DBAL 编写自定义操作。
  • 想要更改持久层?提供的存储库替代方案包括
  • 使用 PHP 编写的映射。
    • 支持自定义数据类型(即值对象)。
    • 使用点表示法轻松映射深层数据结构。
  • 填充是可选的。
    • 需要时使用填充。使用 MongoDBRepositoryHydrator 特性来启用它。
  • 支持自定义 ID 和自增 ID。
    • 想要使用 UUID 或自定义 ID 策略?没问题!
  • 需要缓存层?轻松添加!
    • 需要从 Composer 安装 Repository Cache 包以对所有操作添加一致的缓存。

安装

使用 Composer 安装包

$ composer require nilportugues/mongodb-repository

使用方法

显示代码

查看 /example 目录。提供了 Custom IDAutoIncremental ID 的示例。

说明

  • 您需要一个实现提供的 Mapping 接口的类
  • 您需要一个实现提供的 Identity 接口的类。添加 2 个方法,id()__toString
  • 您需要一个从提供的 MongoDBRepository 类扩展的类。将您的 PDO 连接和映射类注入到 MongoDBRepository

您就可以开始了。

--

映射

映射必须实现 Mapping 接口。

映射类用于从实体中读取数据并将其保存到所选存储中。这是通过映射实体字段并指定哪些字段以及如何存储在数据存储中实现的。

对于复杂对象,比如说一个具有值对象的实体,仍然可以对实体进行单一映射,并访问值对象属性以获取它们存储。

如果使用 hydrator 特性,映射也可用于将数据重新注入到实体中。

实体类

请记住,实体必须实现 Identity 接口才能与 MongoDBRepository 一起工作。此类实体可以是您的任何类。

use NilPortugues\Foundation\Domain\Model\Repository\Contracts\Identity;

class User implements Identity
{
    protected $userId;
    protected $username;
    protected $alias;
    protected $email;
    protected $registeredOn;

    /**
     * User constructor.
     *
     * @param          $userId
     * @param          $username
     * @param          $alias
     * @param          $email
     * @param \DateTime $registeredOn
     */
    public function __construct($userId, $username, $alias, $email, \DateTime $registeredOn)
    {
        $this->userId = $userId;
        $this->username = $username;
        $this->alias = $alias;
        $this->email = $email;
        $this->registeredOn = $registeredOn;
    }

   // ... your getters/setters
  
    public function id()
    {
        return $this->userId;
    }
  
    public function __toString()
    {
        return (string) $this->id();
    }
}

映射类

映射接口的所有方法都是必需的。

use NilPortugues\Foundation\Domain\Model\Repository\Contracts\Mapping;

class UserMapping implements Mapping
{
    /**
     * Name of the identity field in storage.
     */
    public function identity() : string
    {
        return 'user_id';
    }

    /**
     * Returns the table name.
     */
    public function name() : string
    {
        return 'users';
    }

    /**
     * Keys are object properties without property defined in identity(). 
     * Values its MongoDB column equivalents.
     */
    public function map() : array
    {
        return [
            'userId' => 'user_id',
            'username' => 'username',
            'alias' => 'public_username',
            'email' => 'email',
            
            // Notice how we are accessing date value inside
            // the \DateTime object! We use dot notation to 
            // access deep values.
            
            'registeredOn.date' => 'created_at', 
        ];
    }

    /**
     * @param array $data
     * @return User
     */
    public function fromArray(array $data)
    {
        return new User(
            $data['user_id'],
            $data['username'],
            $data['public_username'],
            $data['email'],
            new \DateTime($data['created_at'])
        );
    }

    /**
     * The automatic generated strategy used will be the data-store's if set to true.
     */
    public function autoGenerateId() : bool
    {
        return true;
    }
}

映射存储库

最后,其用法很简单

use MongoDB\Client;
use NilPortugues\Foundation\Infrastructure\Model\Repository\MongoDB\MongoDBRepository;
use NilPortugues\Foundation\Infrastructure\Model\Repository\MongoDB\MongoDBRepositoryHydrator;

class UserRepository extends MongoDBRepository
{
    use MongoDBRepositoryHydrator;
}

$client = new Client();
$mapping = new UserMapping();
$repository = new UserRepository($mapping, $client, 'example_db', 'users');

存储库

仓库类实现了所有与数据交互和过滤所需的方法。

通过扩展 MongoDBRepository 类,MongoDBRepository 默认可以处理所有 CRUD 操作。

如果您不关注 CRUD,您还可以有只读、只写和分页仓库

  • 对于只读仓库,扩展 MongoDBReadRepository 类。
  • 对于只写仓库,扩展 MongoDBWriteRepository 类。
  • 对于分页仓库,扩展 MongoDBPageRepository 类。

方法

在 MongoDBRepository 中可用

MongoDBWriteRepositoryMongoDBReadRepositoryMongoDBPageRepository 下列出的所有方法。

在 MongoDBWriteRepository 中可用

  • public function add($value)
  • public function addAll(array $values)
  • public function remove(Identity $id)
  • public function removeAll(Filter $filter = null)
  • public function transactional(callable $transaction)
  • public function count(Filter $filter = null)
  • public function exists(Identity $id)
  • public function getDriver()

在 MongoDBReadRepository 中可用

  • public function find(Identity $id, Fields $fields = null)
  • public function findBy(Filter $filter = null, Sort $sort = null, Fields $fields = null)
  • public function findByDistinct(Fields $distinctFields, Filter $filter = null, Sort $sort = null, Fields $fields = null)
  • public function count(Filter $filter = null)
  • public function exists(Identity $id)
  • public function getDriver()

在 MongoDBPageRepository 中可用

  • public function findAll(Pageable $pageable = null)
  • public function count(Filter $filter = null)
  • public function exists(Identity $id)
  • public function getDriver()

数据操作

所有数据都可以通过字段名称提取,使用过滤器,应用排序和分页,能够应用字段、过滤器和排序标准。

字段

通过字段选择将导致 hydratation 失败。目前不支持部分对象 hydratation。

类: NilPortugues\Foundation\Domain\Model\Repository\Fields

方法

  • public function __construct(array $fields = [])
  • public function add($field)
  • public function get()

过滤

类: NilPortugues\Foundation\Domain\Model\Repository\Filter

方法

  • public function filters()
  • public function must()
  • public function mustNot()
  • public function should()
  • public function clear()

对于 must()mustNot()should(),可用的方法有

  • public function notStartsWith($filterName, $value)
  • public function notEndsWith($filterName, $value)
  • public function notEmpty($filterName)
  • public function empty($filterName)
  • public function startsWith($filterName, $value)
  • public function endsWith($filterName, $value)
  • public function equal($filterName, $value)
  • public function notEqual($filterName, $value)
  • public function includeGroup($filterName, array $value)
  • public function notIncludeGroup($filterName, array $value)
  • public function range($filterName, $firstValue, $secondValue)
  • public function notRange($filterName, $firstValue, $secondValue)
  • public function notContain($filterName, $value)
  • public function contain($filterName, $value)
  • public function beGreaterThanOrEqual($filterName, $value)
  • public function beGreaterThan($filterName, $value)
  • public function beLessThanOrEqual($filterName, $value)
  • public function beLessThan($filterName, $value)
  • public function clear()
  • public function get()
  • public function hasEmpty($filterName)

分页

分页由两个对象处理,一个是 Pageable,它具有分页的要求,另一个是 Page,它实际上是包含分页数据的页面,例如页码、总数和数据。

分页

类: NilPortugues\Foundation\Domain\Model\Repository\Pageable

方法

  • public function __construct($pageNumber, $pageSize, Sort $sort = null, Filter $filter = null, Fieldse $fields = null)
  • public function offset()
  • public function pageNumber()
  • public function sortings()
  • public function next()
  • public function pageSize()
  • public function previousOrFirst()
  • public function hasPrevious()
  • public function first()
  • public function filters()
  • public function fields()

分页对象

类: NilPortugues\Foundation\Domain\Model\Repository\Page

方法

  • public function __construct(array $elements, $totalElements, $pageNumber, $totalPages, Sort $sort = null, Filter $filter = null, Fields $fields = null)
  • public function content()
  • public function hasPrevious()
  • public function isFirst()
  • public function isLast()
  • public function hasNext()
  • public function pageSize()
  • public function pageNumber()
  • public function totalPages()
  • public function nextPageable()
  • public function sortings()
  • public function filters()
  • public function fields()
  • public function previousPageable()
  • public function totalElements()
  • public function map(callable $converter)

排序

类: NilPortugues\Foundation\Domain\Model\Repository\Sort

方法

  • public function __construct(array $properties = [], Order $order = null)
  • public function andSort(SortInterface $sort)
  • public function orders()
  • public function equals(SortInterface $sort)
  • public function orderFor($propertyName)
  • public function setOrderFor($propertyName, Order $order)
  • public function property($propertyName)

排序

有时您希望根据多个字段排序,这时Order就派上用场了。

: NilPortugues\Foundation\Domain\Model\Repository\Order

方法

  • public function __construct($direction)
  • public function isDescending()
  • public function isAscending()
  • public function __toString()
  • public function equals($object)
  • public function direction()

--

质量

要在命令行运行PHPUnit测试,请转到测试目录并执行phpunit。

此库旨在遵守PSR-1PSR-2PSR-4

如果您注意到遵守上的疏忽,请通过Pull Request发送补丁。

贡献

欢迎为包做出贡献!

支持

您可以通过以下方式之一与我联系

作者

许可证

代码库采用MIT许可证