bentools/opencubes

0.1.1 2019-03-20 10:34 UTC

This package is auto-updated.

Last update: 2024-08-27 21:55:50 UTC


README

Latest Stable Version License Build Status Coverage Status Quality Score Total Downloads

OpenCubes

OpenCubes 是一套与框架无关的组件,用于将 PSR-7 URI 解析为值对象

  • 分页
  • 过滤器
  • 排序
  • 细分(按组)

概述

查看以下 URL

https://your.application/books?page=3&per_page=50&sort[author.name]=asc&filters[published_at]=[2019-01-01+TO+2019-01-31]&filters[category_id]=12&filters[tags][]=foo&filters[tags][]=bar&filters[name][NOT][STARTS_WITH]=foo

这是 OpenCubes 解析它的方式

use BenTools\OpenCubes\Component\Filter\FilterComponent;
use BenTools\OpenCubes\Component\Sort\SortComponent;
use BenTools\OpenCubes\Component\Pager\PagerComponent;
use BenTools\OpenCubes\Component\Filter\Model\CollectionFilter;
use BenTools\OpenCubes\Component\Filter\Model\RangeFilter;
use BenTools\OpenCubes\Component\Filter\Model\SimpleFilter;
use BenTools\OpenCubes\Component\Filter\Model\StringMatchFilter;
use BenTools\OpenCubes\OpenCubes;
use function BenTools\OpenCubes\current_location;

$openCubes = OpenCubes::create();
$sorting = $openCubes->getComponent(SortComponent::getName());
$filters = $openCubes->getComponent(FilterComponent::getName());
$pager = $openCubes->getComponent(
    PagerComponent::getName(),
    ['default_size' => 100],
    current_location() // current_location() is the default and can be replaced by any PSR-7 Uri object
);

// Pagination
echo $pager->getCurrentPage(); // 3
echo $pager->getPerPage(); // 50 (it would be 100 when omiting the per_page parameter)
echo $pager->getCurrentOffset(); // 100

$pager->setNbItems(160); // Your application found 160 items
echo count($pager); // 4 pages of 50 for 160 items

// Sorting
foreach ($sorting->getAppliedSorts() as $sort) {
    echo $sort->getField(); // author.name
    echo $sort->getDirection(); // asc
}

// Filters
foreach ($filters->getAppliedFilters() as $filter) {

    if ($filter instanceof RangeFilter) {
        echo $filter->getField(); // published_at
        echo $filter->getLeft(); // 2019-01-01
        echo $filter->getRight(); // 2019-01-31
    }

    if ($filter instanceof SimpleFilter) {
        echo $filter->getField(); // category_id
        echo $filter->getValue(); // 12
    }

    if ($filter instanceof CollectionFilter) {
        echo $filter->getField(); // tags
        print_r($filter->getValues()); // ['foo', 'bar']
    }

    if ($filter instanceof StringMatchFilter) {
        echo $filter->getField(); // name
        echo $filter->getValue(); // 'foo'
        echo $filter->getOperator(); // StringMatchFilter::STARTS_WITH
        var_dump($filter->isNegated()); // true
    }
}

现在,我们可以要求我们的持久化系统(Doctrine、ElasticSearch、Solr、第三方 API、...)返回书籍

  • 从偏移量 100 开始,限制到 50
  • author.name 排序(使用您自己的逻辑解析字段路径)
  • 发布于 2019-01-012019-01-31 之间
  • 在类别 ID 12
  • 匹配标签 foobar(也可以设置 AND 子句[链接]
  • 但是它们的名称不能以 foo 开头。

将这些值对象转换为查询数据库或 API 现在由您自己负责!OpenCubes 目前不提供桥接,但也许在不久的将来。

自定义

每个组件都提供了大量的自定义选项(查询参数、默认设置、...)。

阅读更多...

此外,您还可以通过实现 适当的接口 创建自己的 URI 解析器/构建器。

HATEOAS

OpenCubes 通过为每个组件提供链接将 HATEOAS 带到您的应用程序

  • 页面/页面大小链接
  • 应用/取消排序链接
  • 应用/移除过滤器
  • ...

每个原生组件都附带默认的 JSON 序列化,该序列化公开了适当的 URL。实现 JSONserializable 不是您的组件的强制要求,它已设计为即用型实现。通过您喜欢的序列化器可以实现不同的序列化(例如 Symfony / JMS 等)。

阅读更多...

深入了解组件

安装

OpenCubes 仍处于开发的早期阶段,可能面临破坏性变更。

请随意贡献或报告任何问题。

composer require bentools/opencubes:1.0.x-dev

测试

./vendor/bin/phpunit

许可

MIT。