kairos-project/api-doctrine-mongodb-odm-loader

这是 kairos API 的 doctrine ODM 组件。旨在用作 MongoDB 的数据访问对象

dev-master / 1.0.x-dev 2018-08-25 10:36 UTC

This package is not auto-updated.

Last update: 2024-09-15 06:00:04 UTC


README

这是 kairos API 的 doctrine ODM 组件。旨在用作 MongoDB 的数据访问对象

1) 主题

doctrine MongoDB ODM 载入器是抽象 API 载入系统的实现。它负责 MongoDB 数据库前的数据访问,并使用 doctrine MongoDB ODM 库。

2) 类架构

doctrine MongoDB 载入器是 API 载入器的简单继承。

3) 依赖描述和使用

撰写本文时,doctrine MongoDB 载入器设计为具有四个生产依赖项,如下

  • psr/log
  • symfony/event-dispatcher
  • kairos-project/api-controller
  • kairos-project/api-loader

3.1) psr/log

在各个项目部分中进行调试和错误追踪是开发中的基本规则,并且它是 OWASP 前十大威胁的一部分。

根据第三版 PHP 标准参考定义,日志组件必须实现特定的接口。顺便说一下,日志系统将可用于每个现有框架。

3.2) symfony/event-dispatcher

载入系统被设计成易于扩展,并将实现一个事件分发系统,允许按优先级附加和分离逻辑。

3.3) kairos-project/api-controller

载入器旨在用于 API 和 kairos 项目中的通用系统是 API 控制器。该系统提供对专用工作流程事件的访问。

载入器将定义控制器组件作为依赖项以使用工作流程事件。

3.4) kairos-project/api-loader

doctrine MongoDB 载入器继承 API 载入器。它使用基载入逻辑并必须将其定义为依赖项。

4) 实现规范

要继承抽象 API 载入器,此组件必须定义抽象方法 methods

  • getQueryBuildingEvent
  • instanciateQueryBuilder
  • executeCollectionQuery
  • executeItemQuery
  • configureQueryForCollection
  • configureQueryForItem

4.1) 依赖注入规范

文档类必须已知以创建新的查询构建器对象。此信息必须通过载入器构造函数引入。

系统需要从请求中获取项目标识符。将引入两个参数以确定其位置,并引入一个参数以定义标识符字段。因此,包名、参数键和标识符名称必须注入。

必须提供文档管理器以在实例化时访问连接。

4.2) getQueryBuildingEvent 算法

getQueryBuildingEvent 方法负责查询构建事件的实例化。

We assume to receive the process event from the parameters.

The method instantiates a new QueryBuildingEvent and injects the process event in the constructor.

Finally, the new event is passing back.

4.3) instanciateQueryBuilder 算法

instanciateQueryBuilder 方法将创建一个新的查询构建器实例,用于配置和执行方法。

We assume to receive the query building event from the parameters.

The method instantiates a new query builder from doctrine document manager. The document name stored inside the documentName attribute used as a constructor argument.

The query building event will receive the builder.

4.4) configureQueryForItem 算法

configureQueryForItem 方法将配置查询构建器实例以加载特定元素。

We assume to receive the query building event from the parameters.
We assume the query builder as query building event part.
We assume the bag name and parameter key as loader attribute.
We assume the identifier field name as loader attribute.

Get the item identifier from the request bag, using the bag name and parameter key.
Define the query field equality clause, regarding the identifier field.

4.5) configureQueryForCollection 算法

configureQueryForCollection方法将配置查询构建器实例以加载一组元素。此方法在MongoDB状态下将保持为空。实际上,instanciateQueryBuilder方法就足够了。

4.6) executeCollectionQuery算法

executeCollectionQuery方法将返回查询结果。

We assume to receive the query building event from the parameters.
We assume the query builder as query building event part.

Execute the query.
Return the query execution result.

4.7) executeItemQuery算法

executeItemQuery方法将实现与executeCollectionQuery相同的逻辑,但将返回单个查询结果。

5) 使用方法

5.1) 基本使用

use KairosProject\ApiDoctrineMongoDBODMLoader\Loader\Loader;
use Symfony\Component\EventDispatcher\EventDispatcher;

// Instanciating event dispatcher
$eventDispatcher = new EventDispatcher();

$loader = new Loader(
    Document::class,
    'id',
    Loader::attribute,
    'document_id'
    $logger
);

$documentList = $loader->loadCollection($event, 'event_name', $eventDispatcher);

$document = $loader->loadItem($event, 'event_name', $eventDispatcher);
$item = $event->getParameter(Loader::EVENT_KEY_STORAGE);

5.2) 完整构造函数使用

public function __construct(
        string $documentName,
        string $identifierField,
        string $requestBag,
        string $requestBagKey,
        LoggerInterface $logger,
        string $collectionEventName = self::COLLECTION_EVENT_NAME,
        string $itemEventName = self::ITEM_EVENT_NAME,
        string $eventKeyStorage = self::EVENT_KEY_STORAGE,
        bool $noItemException = self::NO_ITEM_EXCEPTION
);

5.3) 使用扩展加载

use KairosProject\ApiDoctrineMongoDBODMLoader\Loader\Loader;
use Symfony\Component\EventDispatcher\EventDispatcher;

// Instanciating event dispatcher
$eventDispatcher = new EventDispatcher();

$eventDispatcher->addListener(
    Loader::COLLECTION_EVENT_NAME,
    [
        $extension,
        'someFunction'
    ]
);

$loader = new Loader(
    Document::class,
    'id',
    Loader::attribute,
    'document_id'
    $logger
);

$documentList = $loader->loadCollection($event, 'event_name', $eventDispatcher);