3.1.2 2018-03-04 17:22 UTC

README

Latest Version Software License Total Downloads Build Status

介绍

一个Laravel基础控制器类和一个特性,可以使您向资源URL添加过滤、排序、预加载和分页。

献给乔尔达诺·布鲁诺

此包以我的英雄乔尔达诺·布鲁诺的名字命名。一个真正的先知,敢于梦想超越人们认为可能的事情。由于他的思想和拒绝放弃他的思想,他在1600年被烧死。我强烈推荐这部关于他生活的短篇卡通,由尼尔·德葛拉斯·泰森讲述:https://vimeo.com/89241669

功能

教程

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

安装

composer require jasahub/bruno

用法

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

Book n ----- 1 Author

可用查询参数

实现

<?php

namespace App\Http\Controllers;

use Jasahub\EloquentBuilderTrait;
use Jasahub\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

将返回一个包含预加载 Author 的5个 Book 的集合。

ID模式

/books?includes[]=author:ids

将返回一个包含 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(可选)]转换为一个在评估后具有详细信息的筛选数组。

例如,这个筛选组(详细)

[
    {
        "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。如果您发现符合性疏漏,请通过拉取请求发送补丁。

测试

$ phpunit

贡献

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

许可

MIT 许可证(MIT)。有关更多信息,请参阅 许可文件