PHPackages                             iamtrungbui/monrestapi - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. iamtrungbui/monrestapi

ActiveLibrary[API Development](/categories/api)

iamtrungbui/monrestapi
======================

\#MONRESTAPI CORE A pretty library to help developers build RESTful APIs lightly

02PHP

Since Jan 6Pushed 2y ago1 watchersCompare

[ Source](https://github.com/iamtrungbui/monrestapi)[ Packagist](https://packagist.org/packages/iamtrungbui/monrestapi)[ RSS](/packages/iamtrungbui-monrestapi/feed)WikiDiscussions master Synced 2mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

MONRESTAPI CORE
===============

[](#monrestapi-core)

A pretty library to help developers build `RESTful APIs` lightly.

It's always easy to customize to suit any need such as defining data relationships, authorization, caching, communicating or integrating into other systems.

Features
--------

[](#features)

- Serves RESTful APIs for any MySql database
    - Pagination
    - Sorting
    - Selection
    - Grouping, Having
    - Filtering
    - Relationships
    - Metadata
- Supports Event Bus

System requirements
-------------------

[](#system-requirements)

- PHP: &gt;= 7.0
- Laravel/ Lumen Framework: 5.6.\*
- MySQL
- Message queue server: optional

Installation
------------

[](#installation)

MONRESTAPI CORE is packed as a composer package. So it's installed quickly in 2 steps

1. Require the composer package

    `composer require iamtrungbui/monrestapi`
2. Register the provider ( boostrap/app )

    `Iamtrungbui\Monrestapi\MonrestapiServiceProvider`

API Overview
------------

[](#api-overview)

HTTP MethodAPI URLDescriptionFor exampleGET`/api/entity`List all records of table that match the query`curl http://deadpool-api.com/api/user?filters=age>20`GET`/api/entity/:id`Retrieve a record by primary key :id`curl http://deadpool-api.com/api/user/123`POST`/api/entity`Insert a new record, bulk inserting is also avaiable`curl -X POST http://deadpool-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://deadpool-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://deadpool-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://deadpool-api.com/api/user/123`DELETE`/api/entity`Delete bulk records that match the query`curl -X DELETE http://deadpool-api.com/api/user?filters=age>100`POST`/api/upload`Upload a file`curl -X POST http://deadpool-api.com/api/upload -H "Content-Type: multipart/form-data" -F "data=@deadpool.mp3"`Pagination
----------

[](#pagination)

ParameterRequiredDefaultDescriptionpage\_idNo0Page index, start at 0page\_sizeNo50Number of rows to retrieve per page```
/api/post?page_id=2&page_size=20

```

Sorting
-------

[](#sorting)

Order by multiple columns using **`sorts`** parameter

### Sort ascending

[](#sort-ascending)

```
/api/post?sorts=user_id

```

### Sort descending

[](#sort-descending)

```
/api/post?sorts=-created_at

```

### Sort by multiple columns

[](#sort-by-multiple-columns)

```
/api/post?sorts=user_id,-created_at

```

Selection
---------

[](#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-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
---------

[](#filtering)

OperatorConditionFor example=EQUAL TO/api/deadpool?filters=skill\_id=1!=NOT EQUAL/api/deadpool?filters=skill\_id!=1&gt;GREATER/api/deadpool?filters=skill\_id&gt;1&gt;=GREATER OR EQUAL/api/deadpool?filters=skill\_id&gt;=1&lt;LESS/api/deadpool?filters=skill\_id&lt;1&lt;=LESS OR EQUAL/api/deadpool?filters=skill\_id&lt;=1={}IN/api/deadpool?filters=skill\_id={1;2;3}!={}NOT IN/api/deadpool?filters=skill\_id!={1;2;3}=\[\]BETWEEN/api/deadpool?filters=skill\_id=\[1;20\]!=\[\]NOT BETWEEN/api/deadpool?filters=skill\_id!=\[1;20\]~LIKE/api/deadpool?filters=title~hello!~NOTLINE/api/deadpool?filters=title!~helloMONRESTAPI CORE 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
------------------

[](#entity-conventions)

MONRESTAPI CORE 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_case` that correspond to a model class with the name in `CamelCase`
- Or the API entity name is the same as a DB table name

Relationships
-------------

[](#relationships)

MONRESTAPI CORE is packed into a `Laravel`/ `Lumen` package so relationships also are defined as methods on `Eloquent` model classes.

See Laravel docs for details:

Let's consider the following relationship definations:

- A `Nation` has many `City` (one-to-many relationship)

```
namespace App\Models;
class Nation extends Iamtrungbui\Monrestapi\BaseModel {
    protected $table = 'location_nation';
    public function cities() {
        return $this->hasMany('App\Models\City', 'nation_id', id);
    }
}

```

- A `City` belongs to a `Nation` (many-to-one relationship)
- A `City` has many `District` (one-to-many relationship)

```
namespace App\Models;
class City extends Iamtrungbui\Monrestapi\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 `District` belongs to a `City` (many-to-one relationship)

```
namespace App\Models;
class District extends Iamtrungbui\Monrestapi\BaseModel {
    protected $table = 'location_district';
    public function city() {
        return $this->belongsTo('App\Models\City', 'city_id');
    }
}

```

### Selection on relationships

[](#selection-on-relationships)

MONRESTAPI CORE 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

[](#filtering-on-relationships)

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

```

Metric
------

[](#metric)

### metric=get (by default): Retrieve all records that match the query

[](#metricget-by-default-retrieve-all-records-that-match-the-query)

```
/api/post

```

or

```
/api/post?metric=get

```

Response format

```
{
    "meta": {
        "has_next": true,
        "total_count": 69,
        "page_count": 2,
        "page_size": 21,
        "page_id": 0
    },
    "result": [],
    "status": "successful"
}

```

### metric=first: Retrieve the first record that matchs the query

[](#metricfirst-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

[](#metriccount-retrieve-the-number-of-records-that-match-the-query)

```
/api/post?metric=count

```

Response format

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

```

### metric=increment/ decrement: Provides convenient methods for incrementing or decrementing the value of a selected column

[](#metricincrement-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
---------

[](#event-bus)

... loading

.env configurations
-------------------

[](#env-configurations)

KeyDefault valueDescriptionMONRESTAPI\_PREFIX\_URL`api`API URL prefixMONRESTAPI\_MODEL\_NAMESPACE`App\Models`Models namespaceMONRESTAPI\_UPLOAD\_PATH`/home/upload`Upload pathMONRESTAPI\_MQ\_ENABLE`false`Enable / Disable Message queue (Event Bus)MONRESTAPI\_MQ\_HOSTMessage queue server hostMONRESTAPI\_MQ\_PORTMessage queue server portMONRESTAPI\_MQ\_USERNAMEMessage queue authentication - usernameMONRESTAPI\_MQ\_PASSWORDMessage queue authentication - passwordMONRESTAPI\_\_MQ\_EXCHANGE\#iamtrungbui

###  Health Score

12

—

LowBetter than 0% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity2

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity19

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/1c042613c8a0df5ca6b7f361f64e95de03c57d547764e07d28d098a9512ec374?d=identicon)[iamtrungbui](/maintainers/iamtrungbui)

---

Top Contributors

[![iamtrungbui](https://avatars.githubusercontent.com/u/6389210?v=4)](https://github.com/iamtrungbui "iamtrungbui (8 commits)")

### Embed Badge

![Health badge](/badges/iamtrungbui-monrestapi/health.svg)

```
[![Health](https://phpackages.com/badges/iamtrungbui-monrestapi/health.svg)](https://phpackages.com/packages/iamtrungbui-monrestapi)
```

###  Alternatives

[stripe/stripe-php

Stripe PHP Library

4.0k143.3M475](/packages/stripe-stripe-php)[twilio/sdk

A PHP wrapper for Twilio's API

1.6k92.9M270](/packages/twilio-sdk)[knplabs/github-api

GitHub API v3 client

2.2k15.8M187](/packages/knplabs-github-api)[facebook/php-business-sdk

PHP SDK for Facebook Business

90121.9M34](/packages/facebook-php-business-sdk)[meilisearch/meilisearch-php

PHP wrapper for the Meilisearch API

73813.7M114](/packages/meilisearch-meilisearch-php)[google/gax

Google API Core for PHP

263103.1M453](/packages/google-gax)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
