duongld/bruno

dev-master 2021-03-27 15:27 UTC

This package is not auto-updated.

Last update: 2024-09-23 06:02:27 UTC


README

Latest Version Software License Build Status Coverage Status Total Downloads

简介

一个Laravel基础控制器类和一个特性,允许您为资源URL添加过滤、排序、预加载和分页功能。

献给Bruno

此包以我的英雄Giordano Bruno的名字命名。一个真正的先知,敢于梦想那些被认为不可能的事情。为了他的思想和拒绝放弃它们,他在1600年被活活烧死。 我强烈推荐这部由Neil deGrasse Tyson讲述他生平的短片

功能

  • 解析GET参数以动态预加载相关资源、排序和分页
  • 使用过滤组进行高级资源过滤
  • 使用 duongld\Architect 进行外部、id或内嵌相关资源的加载

指南

要开始使用Bruno,我强烈推荐阅读关于 Laravel API中的资源控制 的文章

安装

composer require duongld/bruno

使用

以下示例将是一个假定的资源端点 /books,它将返回一个属于每个 AuthorBook 集合。

Book n ----- 1 Author

可用的查询参数

执行

<?php

namespace App\Http\Controllers;

use Duongld\Api\Controller\EloquentBuilderTrait;
use Duongld\Api\Controller\LaravelController;
use App\Models\Book;

class BookController extends LaravelController
{
    use EloquentBuilderTrait;

    public function getBooks()
    {
        // Parse the resource options given by GET parameters
        $resourceOptions = $this->parseResourceOptions();

        // Start a new query for books using Eloquent query builder
        // (This would normally live somewhere else, e.g. in a Repository)
        $query = Book::query();
        $this->applyResourceOptions($query, $resourceOptions);
        $books = $query->get();

        // Parse the data using Optimus\Architect
        $parsedData = $this->parseData($books, $resourceOptions, 'books');

        // Create JSON response of parsed data
        return $this->response($parsedData);
    }
}

语法文档

预加载

简单预加载

/books?includes[]=author

使用模型 Book 中的函数关系author来加载额外的 Author 数组。

IDs模式

/books?includes[]=author:ids

获取所有 Author 的id。

侧加载模式

/books?includes[]=author:sideload

Author 数组分离成另一个单独的数组。在 Book 中仍将包含 Author 的id。

请参阅Duongld\Architect的README中的预加载部分

分页

有两个参数: limitpagelimit 将确定每页的记录数量,而 page 将确定当前页。

/books?limit=10&;page=3

将返回从30到40的book记录。

排序

应定义为排序规则数组。它们将按定义的顺序应用。

排序规则

示例

[
    {
        "key": "title",
        "direction": "ASC"
    }, {
        "key": "year",
        "direction": "DESC"
    }
]

这将导致书籍按书名升序排序,然后按年份降序排序。

过滤

应定义为过滤组数组。

过滤组

过滤器

运算符

特殊值

自定义过滤器(请参阅下面的英文文档)

可选的简写过滤语法(请参阅下面的英文文档)

Bruno ENGLISH

Latest Version Software License Build Status Coverage Status Total Downloads

简介

A Laravel base controller class and a trait that will enable to add filtering, sorting, eager loading and pagination to your resource URLs.

Dedicated to Giordano Bruno

This package is named after my hero Giordano Bruno. A true visionary who dared to dream beyond what was thought possible. For his ideas and his refusal to renounce them he was burned to the stake in 1600. I highly recommend this short cartoon on his life narrated by Neil deGrasse Tyson.

功能

  • Parse GET parameters for dynamic eager loading of related resources, sorting and pagination
  • Advanced filtering of resources using filter groups
  • 使用 duongld\Architect 进行相关资源的侧载、ID 加载或嵌入加载。
  • ... 欢迎在这里提出新功能想法 Ideas for new functionality is welcome here

教程

要开始使用 Bruno,我强烈推荐我的关于 Laravel API 中资源控制的文章:resource controls in Laravel APIs

安装

composer require duongld/bruno

用法

以下示例将使用假设的资源端点 /books,该端点将返回一个包含 Book 的集合,每个 Book 都属于一个 Author

Book n ----- 1 Author

可用的查询参数

实现

<?php

namespace App\Http\Controllers;

use Duongld\Api\Controller\EloquentBuilderTrait;
use Duongld\Api\Controller\LaravelController;
use App\Models\Book;

class BookController extends LaravelController
{
    use EloquentBuilderTrait;

    public function getBooks()
    {
        // Parse the resource options given by GET parameters
        $resourceOptions = $this->parseResourceOptions();

        // Start a new query for books using Eloquent query builder
        // (This would normally live somewhere else, e.g. in a Repository)
        $query = Book::query();
        $this->applyResourceOptions($query, $resourceOptions);
        $books = $query->get();

        // Parse the data using Optimus\Architect
        $parsedData = $this->parseData($books, $resourceOptions, 'books');

        // Create JSON response of parsed data
        return $this->response($parsedData);
    }
}

语法文档

预加载

简单预加载

/books?includes[]=author

将返回一个包含 5 个 Book 的集合,这些 Book 已经预加载了 Author

IDs模式

/books?includes[]=author:ids

将返回一个包含 Book 的集合,这些 Book 已经预加载了它们 Author 的 ID。

侧加载模式

/books?includes[]=author:sideload

将返回一个包含 Book 的集合和根作用域中预加载的它们 Author 的集合。

有关 Optimus\Architect 的 README 中的预加载类型更多信息

分页

有两个参数可用:limitpagelimit 将确定每页的记录数,而 page 将确定当前页。

/books?limit=10&;page=3

将返回第 30-40 本书籍。

排序

应定义为排序规则的数组。它们将按照定义的顺序应用。

排序规则

示例

[
    {
        "key": "title",
        "direction": "ASC"
    }, {
        "key": "year",
        "direction": "DESC"
    }
]

将按标题升序排序书籍,然后按年份降序排序。

过滤

应定义为过滤组的数组。

过滤组

过滤器

运算符

特殊值

自定义过滤器

记住我们的关系 Books n ----- 1 Author。假设你想通过 Author 名称过滤书籍。

[
    {
        "filters": [
            {
                "key": "author",
                "value": "Optimus",
                "operator": "sw"
            }
        ]
    }
]

现在这很好,但是我们的模型上没有 author 属性,因为它是一个关系。这会导致错误,因为 Eloquent 会尝试在一个不存在的 author 属性上使用 where 子句。我们可以通过实现自定义过滤器来修复这个问题。在任何使用 EloquentBuilderTrait 的地方,实现一个名为 filterAuthor 的函数

public function filterAuthor(Builder $query, $method, $clauseOperator, $value)
{
    // if clauseOperator is idential to false,
    //     we are using a specific SQL method in its place (e.g. `in`, `between`)
    if ($clauseOperator === false) {
        call_user_func([$query, $method], 'authors.name', $value);
    } else {
        call_user_func([$query, $method], 'authors.name', $clauseOperator, $value);
    }
}

注意:需要注意的是,自定义过滤器将查找与属性同名的关联。例如,如果尝试对名为 author 的属性使用自定义过滤器,那么 Bruno 将尝试从 Book 模型中预加载 author 关联。

自定义过滤器函数

示例

[
    {
        "or": true,
        "filters": [
            {
                "key": "author",
                "value": "Optimus",
                "operator": "sw"
            },
            {
                "key": "author",
                "value": "Prime",
                "operator": "ew"
            }
        ]
    }
]

作者姓名以 Optimus 开头或以 Prime 结尾的书籍。

[
    {
        "filters": [
            {
                "key": "author",
                "value": "Brian",
                "operator": "sw"
            }
        ]
    },
    {
        "filters": [
            {
                "key": "year",
                "value": 1990,
                "operator": "gt"
            },
            {
                "key": "year",
                "value": 2000,
                "operator": "lt"
            }
        ]
    }
]

作者姓名以 Brian 开头且出版年份在 1990 年至 2000 年之间的书籍。

可选简写过滤语法(简写)

过滤器可以可选地以简写形式表达,它将给定一个给定过滤器数组 [key, operator, value, not(optional)] 并在评估时构建一个详尽的过滤器数组。

例如,以下过滤器组(详尽)

[
    {
        "or": false,
        "filters": [
            {
                "key": "author",
                "value": "Optimus",
                "operator": "sw"
            },
            {
                "key": "author",
                "value": "Prime",
                "operator": "ew"
            },
            {
                "key": "deleted_at",
                "value": null,
                "operator": "eq",
                "not": true
            }
        ]
    }
]

可以以这种方式表达(简写)

[
    {
        "or": false,
        "filters": [
            ["author", "sw", "Optimus"],
            ["author", "ew", "Prime"],
            ["deleted_at", "eq", null, true]
        ]
    }
]

标准

此包符合 PSR-1PSR-2PSR-4。如果您发现合规性问题,请通过拉取请求发送补丁。

贡献

请参阅 CONTRIBUTING 以获取详细信息。

许可证

MIT 许可证 (MIT)。请参阅 许可证文件 以获取更多信息。