azen/apify-lumen
Composer 安装命令:
composer require azen/apify-lumen
包简介
A pretty library to help developers build RESTful APIs lightly, quickly and properly even without writing code
README 文档
README
A pretty library to help developers build RESTful APIs lightly, quickly and properly even without writing code.
It's always easy to customize to suit any need such as defining data relationships, authorization, caching, communicating or integrating into other systems.
Features
- Serves RESTful APIs for any MySql database
- Pagination
- Sorting
- Selection
- Grouping, Having
- Filtering
- Relationships
- Metadata
- Supports Event Bus
Using Apify
- Apify client for PHP: https://github.com/megaads-vn/apify-client-php
- Use HTTP clients like Postman to invoke RESTful API calls.
- Combine with API Gateway is also recommended to build a completely development environment for microservice.
Installation
Apify is packed as a composer package. So it's installed quickly in 2 steps
-
Require the composer package
composer require megaads/apify -
Register the provider:
Megaads\Apify\ApifyServiceProvider
System requirements
- PHP: >= 5.6
- Laravel/ Lumen Framework: 5.4.*
- MySQL
- Message queue server: optional
API Overview
| HTTP Method | API URL | Description | For example |
|---|---|---|---|
| GET | /api/entity |
List all records of table that match the query | curl http://my-api.com/api/user?filters=age>20 |
| GET | /api/entity/:id |
Retrieve a record by primary key :id | curl http://my-api.com/api/user/123 |
| POST | /api/entity |
Insert a new record, bulk inserting is also avaiable | curl -X POST http://my-api.com/api/user -d '[{"username":"user1", "age":"20"},{"username":"user2", "age":"25"}]' -H "Content-Type: application/json" |
| PUT | /api/entity/:id |
Replaces existed record with new one | curl -X PUT http://my-api.com/api/user/123 -d '{"id":"123", "username":"user1", "age":"20"}' -H "Content-Type: application/json" |
| PATCH | /api/entity/:id |
Update record element by primary key | curl -X PATCH http://my-api.com/api/user/123 -d '{"age":"21"}' -H "Content-Type: application/json" |
| DELETE | /api/entity/:id |
Delete a record by primary key | curl -X DELETE http://my-api.com/api/user/123 |
| DELETE | /api/entity |
Delete bulk records that match the query | curl -X DELETE http://my-api.com/api/user?filters=age>100 |
| POST | /api/upload |
Upload a file | curl -X POST http://my-api.com/api/upload -H "Content-Type: multipart/form-data" -F "data=@song.mp3" |
Pagination
| Parameter | Required | Default | Description |
|---|---|---|---|
| page_id | No | 0 | Page index, start at 0 |
| page_size | No | 50 | Number of rows to retrieve per page |
/api/post?page_id=2&page_size=20
Sorting
Order by multiple columns using sorts parameter
Sort ascending
/api/post?sorts=user_id
Sort descending
/api/post?sorts=-created_at
Sort by multiple columns
/api/post?sorts=user_id,-created_at
Selection
Select columns from the records using fields parameter. SQL aggregate functions such as COUNT, MAX, MIN, SUM, AVG, SQL aliases are also available
/api/post?fields=id,content,user_id,sum(view_count) as view_sum
Group By
Group the result-set by one or more columns using groups parameter and combine with aggregate functions using Selection
/api/post?fields=user_id,sum(view_count)&groups=user_id
Filtering
| Operator | Condition | For example |
|---|---|---|
| = | Equal to | /api/post?filters=user_id=1 |
| != | Not equal | /api/post?filters=user_id!=1 |
| > | Greater | /api/post?filters=user_id>1 |
| >= | Greater or equal | /api/post?filters=user_id>=1 |
| < | Less | /api/post?filters=user_id<1 |
| <= | Less or equal | /api/post?filters=user_id<=1 |
| ={} | In | /api/post?filters=user_id={1;2;3} |
| !={} | Not in | /api/post?filters=user_id!={1;2;3} |
| =[] | Between | /api/post?filters=user_id=[1;20] |
| !=[] | Not between | /api/post?filters=user_id!=[1;20] |
| ~ | Like | /api/post?filters=title~hello |
| !~ | Not like | /api/post?filters=title!~hello |
Apify supports filtering records based on more than one AND, NOT condition by using comma. For example:
/api/post?filters=user_id=1,status={enabled;pending},tile~hello,view_count!=null
Complex conditions that combine AND, OR and NOT will be available soon.
Entity conventions
Apify works by a simple mechanism, looking for a model class that correspond to the API entity, otherwise the API entity will be matched to a suitable DB table. That means no model class is required to create, do it only in the case of defining relationships, customizing.
So API entity name should follow one of the conventions:
-
The API entity name is the same as a model class name
-
Or the API entity name in
snake_casethat correspond to a model class with the name inCamelCase -
Or the API entity name is the same as a DB table name
Relationships
Apify is packed into a Laravel/ Lumen package so relationships also are defined as methods on Eloquent model classes.
See Laravel docs for details: https://laravel.com/docs/5.6/eloquent-relationships
Let's consider the following relationship definations:
- A
Nationhas manyCity(one-to-many relationship)
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); } }
- A
Citybelongs to aNation(many-to-one relationship) - A
Cityhas manyDistrict(one-to-many relationship)
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); } }
- A
Districtbelongs to aCity(many-to-one relationship)
namespace App\Models; class District extends \Apify\Models\BaseModel { protected $table = 'location_district'; public function city() { return $this->belongsTo('App\Models\City', 'city_id'); } }
Selection on relationships
Apify provides the ability to embed relational data into the results using embeds parameter
For example
/api/nation?embeds=cities
/api/city?embeds=nation,districts
/api/district?embeds=city
Even nested relationships
/api/nation?embeds=cities.districts
/api/district?embeds=city.nation
Filtering on relationships
/api/city?filters=nation.location_code=EU,districts.name~land
Metric
metric=get (by default): Retrieve all records that match the query
/api/post
or
/api/post?metric=get
Response format
{
"meta": {
"has_next": true,
"total_count": 100,
"page_count": 2,
"page_size": 50,
"page_id": 0
},
"result": [],
"status": "successful"
}
metric=first: Retrieve the first record that matchs the query
/api/post?metric=first
Response format
{
"result": {},
"status": "successful"
}
metric=count: Retrieve the number of records that match the query
/api/post?metric=count
Response format
{
"result": 50,
"status": "successful"
}
metric=increment/ decrement: Provides convenient methods for incrementing or decrementing the value of a selected column
/api/post?metric=increment&fields=view_count
Response format
{
"result": 1,
"status": "successful"
}
Event Bus
Is being updated ...
.env configurations
| Key | Default value | Description |
|---|---|---|
| APIFY_PREFIX_URL | api |
API URL prefix |
| APIFY_MODEL_NAMESPACE | App\Models |
Models namespace |
| APIFY_UPLOAD_PATH | /home/upload |
Upload path |
| APIFY_MQ_ENABLE | false |
Enable / Disable Message queue (Event Bus) |
| APIFY_MQ_HOST | Message queue server host | |
| APIFY_MQ_PORT | Message queue server port | |
| APIFY_MQ_USERNAME | Message queue authentication - username | |
| APIFY_MQ_PASSWORD | Message queue authentication - password | |
| APIFY_MQ_EXCHANGE | apify |
Message queue exchange name |
Authenticate Apify & authorize Apify?
Read docs here : https://github.com/megaads-vn/apify/blob/master/README-AUTH.md
License
The Apify is open-sourced software licensed under the MIT license
Contact us/ Instant feedback
Email: phult.contact@gmail.com
Skype: phult.bk
If you find a bug, please report it here on Github.
azen/apify-lumen 适用场景与选型建议
azen/apify-lumen 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 13 次下载、GitHub Stars 达 0, 最近一次更新时间为 2021 年 02 月 22 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「rest」 「api」 「webservice」 「laravel」 「Microservice」 「lumen」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 azen/apify-lumen 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 azen/apify-lumen 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 azen/apify-lumen 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Wrapper around PHP SoapClient class
Externalize Symfony VarDumper dumps
PHP implementation of GestPay (Banca Sella) Web Services
A PSR-7 compatible library for making CRUD API endpoints
Api bundle
A PHP client for TNT Express National webservices
统计信息
- 总下载量: 13
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 18
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2021-02-22