megaads/apify

一个漂亮的库,帮助开发者轻松、快速、正确地构建RESTful API,即使不写代码也能实现

1.5.9 2024-01-31 08:59 UTC

README

一个漂亮的库,帮助开发者轻松、快速、正确地构建RESTful APIs,即使不写代码也能实现。

它总是很容易定制以满足各种需求,如定义数据关系、授权、缓存、通信或与其他系统集成。

功能

  • 为任何MySQL数据库提供RESTful API
    • 分页
    • 排序
    • 选择
    • 分组,HAVING
    • 过滤
    • 关系
    • 元数据
  • 支持事件总线

使用Apify

安装

Apify被打包为composer包。因此,只需两步即可快速安装

  1. 需要composer包

    composer require megaads/apify

  2. 注册提供者

    Megaads\Apify\ApifyServiceProvider

系统要求

  • PHP: >= 5.6
  • Laravel/ Lumen框架: 5.4.*
  • MySQL
  • 消息队列服务器:可选

API概述

分页

/api/post?page_id=2&page_size=20

排序

使用sorts参数按多个列排序

升序排序

/api/post?sorts=user_id

降序排序

/api/post?sorts=-created_at

按多个列排序

/api/post?sorts=user_id,-created_at

选择

使用fields参数从记录中选择列。SQL聚合函数(如COUNTMAXMINSUMAVG)以及SQL别名也可用

/api/post?fields=id,content,user_id,sum(view_count) as view_sum

GROUP BY

使用groups参数按一个或多个列对结果集进行分组,并结合使用Selection和聚合函数

/api/post?fields=user_id,sum(view_count)&groups=user_id

过滤

Apify支持使用逗号通过一个以上的ANDNOT条件过滤记录。例如

/api/post?filters=user_id=1,status={enabled;pending},tile~hello,view_count!=null

将很快提供结合ANDORNOT的复杂条件。

范围函数

/api/order?scopes=orderMeta(values=[adwords,123123];keys=[from,campaign_id]),customer(keyword=nguyen van nam)
namespace App\Models;

class Order extends \Megaads\Apify\Models\BaseModel
{
    public function scopeCustomer($query, $params) {
        if (isset($params['keyword'])) {
            //do something
        }
    }

    public function scopeOrderMeta($query, $params) {
        if (isset($params['keys']) && isset($params['values'])) {
            //do something
        }
    }
}

实体约定

Apify通过简单的机制工作,寻找与API实体对应的模型类,否则API实体将与合适的数据库表匹配。这意味着不需要模型类来创建,只有在定义关系、自定义的情况下才这样做。

因此,API实体名称应遵循以下约定之一

  • API实体名称与模型类名称相同

  • 或API实体名称为snake_case,与具有CamelCase名称的模型类相对应

  • 或API实体名称与数据库表名称相同

关系

Apify被打包成Laravel/ Lumen包,因此关系也被定义为Eloquent模型类上的方法。

有关详细信息,请参阅Laravel文档:https://laravel.net.cn/docs/5.6/eloquent-relationships

让我们考虑以下关系定义

  • Nation 有许多 City (一对多关系)
namespace App\Models;
class Nation extends \Apify\Models\BaseModel {
    protected $table = 'location_nation';
    public function cities() {
        return $this->hasMany('App\Models\City', 'nation_id', id);
    }
}
  • City 属于一个 Nation (多对一关系)
  • City 有许多 District (一对多关系)
namespace App\Models;
class City extends \Apify\Models\BaseModel {
    protected $table = 'location_city';
    public function nation() {
        return $this->belongsTo('App\Models\Nation', 'nation_id');
    }
    public function districts() {
        return $this->hasMany('App\Models\District', 'city_id', id);
    }
}
  • District 属于一个 City (多对一关系)
namespace App\Models;
class District extends \Apify\Models\BaseModel {
    protected $table = 'location_district';
    public function city() {
        return $this->belongsTo('App\Models\City', 'city_id');
    }
}    

关系选择

Apify提供了使用embeds参数将关系数据嵌入到结果中的能力

例如:

/api/nation?embeds=cities
/api/city?embeds=nation,districts
/api/district?embeds=city

即使是嵌套关系

/api/nation?embeds=cities.districts
/api/district?embeds=city.nation

基于关系的过滤

/api/city?filters=nation.location_code=EU,districts.name~land

指标

metric=get(默认):检索所有与查询匹配的记录

/api/post

/api/post?metric=get

响应格式

{
    "meta": {
        "has_next": true,
        "total_count": 100,
        "page_count": 2,
        "page_size": 50,
        "page_id": 0
    },
    "result": [],
    "status": "successful"
}

metric=first:检索与查询匹配的第一个记录

/api/post?metric=first

响应格式

{    
    "result": {},
    "status": "successful"
}

metric=count:检索与查询匹配的记录数

/api/post?metric=count

响应格式

{    
    "result": 50,
    "status": "successful"
}

metric=increment/decrement:提供方便的方法来增加或减少所选列的值

/api/post?metric=increment&fields=view_count

响应格式

{    
    "result": 1,
    "status": "successful"
}

事件总线

正在更新...

.env配置

认证Apify并授权Apify?

请在此处阅读文档: https://github.com/megaads-vn/apify/blob/master/README-AUTH.md

许可协议

Apify是开源软件,根据MIT许可证授权。

联系我们/即时反馈

电子邮件: phult.contact@gmail.com

Skype: phult.bk

如果您发现错误,请在此处GitHub上报告