PHPackages                             camilord/laravel-api-controller - 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. camilord/laravel-api-controller

ActiveLibrary[API Development](/categories/api)

camilord/laravel-api-controller
===============================

A laravel api base controller with basic CRUD mapped to the model. Fork from https://github.com/phpsa/laravel-api-controller

2.9.3(1y ago)04.8kMITPHPPHP &gt;=8.0|&gt;=8.1|&gt;=8.2|&gt;=8.3

Since Dec 3Pushed 1y ago1 watchersCompare

[ Source](https://github.com/camilord/laravel-api-controller)[ Packagist](https://packagist.org/packages/camilord/laravel-api-controller)[ RSS](/packages/camilord-laravel-api-controller/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (5)Dependencies (3)Versions (13)Used By (0)

Fork from phpsa/laravel-api-controller
--------------------------------------

[](#fork-from-phpsalaravel-api-controller)

This repository is required from one of my work projects I maintained and unfortunately the maintainer remove the `hasRepository` and `BaseRepository` after version 2.0.0.

Laravel Api Controller
======================

[](#laravel-api-controller)

[![For Laravel 5](https://camo.githubusercontent.com/034e74b0ecf2d8f3481b29b20633094b9bdfe45dbae402712ae325c7c8ebbce6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d36253230746f253230382d626c75652e737667)](https://github.com/phpsa/laravel-api-controller/issues)[![Build Status](https://camo.githubusercontent.com/5a85e1ee7ad4a44cc95151f9bd406b59bddc00220bebfb9a6cf8da80b1b02867/68747470733a2f2f6170692e7472617669732d63692e636f6d2f70687073612f6c61726176656c2d6170692d636f6e74726f6c6c65722e7376673f6272616e63683d6d6173746572)](https://travis-ci.com/phpsa/laravel-api-controller)[![Coverage Status](https://camo.githubusercontent.com/405243c48aa260e2212659e214ca6fcf17b0e5d13f1b1e0c53b8766eca1b104a/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f70687073612f6c61726176656c2d6170692d636f6e74726f6c6c65722f62616467652e7376673f6272616e63683d6d6173746572)](https://coveralls.io/github/phpsa/laravel-api-controller?branch=master)[![Packagist](https://camo.githubusercontent.com/fdecd51f98f2c7416650df2212c564b056551e4c5370ca2c9a1bcabbf50256d1/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f70687073612f6c61726176656c2d6170692d636f6e74726f6c6c65722e737667)](https://packagist.org/packages/phpsa/laravel-api-controller)[![Packagist](https://camo.githubusercontent.com/16618e9bc350861abfab05540809e048866fbc3d0c53439b8121f86d29bf61ae/68747470733a2f2f706f7365722e707567782e6f72672f70687073612f6c61726176656c2d6170692d636f6e74726f6c6c65722f642f746f74616c2e737667)](https://packagist.org/packages/phpsa/laravel-api-controller)[![Packagist](https://camo.githubusercontent.com/d03422abccaad97a47ede7d20e709a05b7775b6b517af72e8f898e0c20d9bfa7/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f70687073612f6c61726176656c2d6170692d636f6e74726f6c6c65722e737667)](https://packagist.org/packages/phpsa/laravel-api-controller)[![Github Issues](https://camo.githubusercontent.com/ac099f18c1f54f393cd840c6df67f4a7df631d4d0824d0e0ea77b491e3817785/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f70687073612f6c61726176656c2d6170692d636f6e74726f6c6c6572)](https://github.com/phpsa/laravel-api-controller/issue)

Basic CRUD API Methods that can be extended for your models by default has a list, show, update, add and delete endpoint to interact with your model.

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

[](#installation)

Install via composer

```
composer require phpsa/laravel-api-controller
```

### Publish Configuration File (optional - if you need to change any of the default configurations)

[](#publish-configuration-file-optional---if-you-need-to-change-any-of-the-default-configurations)

```
php artisan vendor:publish --provider="Phpsa\LaravelApiController\ServiceProvider" --tag="config"
```

Usage
-----

[](#usage)

**Generate a new Api Controller, Repository and Route via `php artisan make:api {ModelName}`**

This will create a Api/ModelNameController for you and you will have the basic routes in place as follows:

- GET `api/v1/{model_name}` - list all/paged/filtered (class::index)
- GET `api/v1/{model_name}/$id` - Show a specified id (class::show)
- POST `api/v1/{model_name}` - Insert a new record (class::store)
- PUT `api/v1/{model_name}/$id` - Update an existing record (class::update)
- DELETE `api/v1/{model_name}/$id` - Delete an existing record (class::destroy)

You can override the methods by simply putting in your own methods to override - method names in braces above

Events
------

[](#events)

- POST (class::store) - triggers a new `Phpsa\LaravelApiController\Events\Created` Event which has the new record available as `$record`
- PUT (class::update) - triggers a new `Phpsa\LaravelApiController\Events\Updated` Event which has the updated record available as `$record`
- DELETE (class::destry) - triggers a new `Phpsa\LaravelApiController\Events\Deleted` Event which has the deleted record available as `$record`

Policies
--------

[](#policies)

Policies:

Generate with `php artisan make:policy PostPolicy --model=Post`

- Get list - calls the `viewAny` policy
- Get single - calls the `view` policy
- Post New - calls the `create` policy
- Put Update - calls the `update` policy
- Delete item - calls the `delete` policy

Query/Data modifiers in policies for the api endpoints

- `qualifyCollectionQueryWithUser($user, $repository)` -&gt; return void - add any queries to the repository (ie -&gt;where('x','))
- `qualifyItemQueryWithUser($user, $repository)`-&gt; return void - add any queries to the repository (ie -&gt;where('x','))
- `qualifyStoreDataWithUser($data)` - return the updated data array
- `qualifyUpdateDataWithUser($data)` - return the updated data array

Resources / Collections (Transforming)
--------------------------------------

[](#resources--collections-transforming)

Resources:

Generate with `php artisan make:apiresource UserResource` and `php artisan make:resource UserCollection`

Change the Resource to extend from:

use `Phpsa\LaravelApiController\Http\Resources\ApiResource` for your resource use `Phpsa\LaravelApiController\Http\Resources\ApiCollection` for your resource collection

in your controller override the following params:

```
	protected $resourceSingle = UserResource::class;
	protected $resourceCollection = UserCollection::class;
```

Snake vs Camel
--------------

[](#snake-vs-camel)

- middleware to convert all camel to snake: `Phpsa\LaravelApiController\Http\Middleware\SnakeCaseInputs`
- set request header `X-Accept-Case-Type` to either `snake` or `camel` to alter your data response

Filtering
---------

[](#filtering)

For the get command you can filter by using the following url patterns

SeperatorDescriptionExampleResult*`=`*Equals?filter\[field\]=helloselect ... where field = 'hello'*`!=`*Not Equals?filter\[field!\]=helloselect ... where field != 'hello'*``*Not Equals (alt)?filter\[field&lt;&gt;\]=helloselect ... where field != 'hello'*`>`*Greater Than?filter\[field&gt;\]=5select ... where field &gt; 5*`>=`*Greater Or Equal to?filter\[field&gt;=\]=5select ... where field &gt;= 5*`whereNotNull('age');
}
```

Add to your allowedScopes and can then be called in url as `?ageNull=1` for where null and `?ageNull=0` for where age not null

Scopes
------

[](#scopes)

In addition to filtering, you can use Laravel's Eloquent [Query Scopes](https://laravel.com/docs/6.x/eloquent#local-scopes) to do more complex searches or filters. Simply add an `$allowedScopes` to your `ApiResource`, and that scope will be exposed as a query parameter.

Assuming you have a `scopeFullname` defined on your Eloquent Model, you can expose this scope to your API as follows:

```
protected static $allowedScopes = [
  'fullname'
];
```

Given the above `$allowedScopes` array, your API consumers will now be able to request `?fullname=John`. The query parameter value will be passed to your scope function in your Eloquent Model.

Filtering on related models
---------------------------

[](#filtering-on-related-models)

You can easily filter using any related model that is configured for `include`. Simply specify `?filter[model.field]=123` in your query string. The same filter options above apply to related fields.

Fields, Relationships, Sorting &amp; Pagination
===============================================

[](#fields-relationships-sorting--pagination)

Fields
------

[](#fields)

By default all fields are returned, you can limit that to specific fields in the following ways:

- Api Controller parameter `$defaultFields` default as `protected $defaultFields = ['*'];` - switch to include an array of fields
- fields param in url querystring: ie `fields=id,name,age` = will only return those, this will also override the above.
- in your response resource you can set the static::allowedFields to lock down which fields are returnable
- `addfields` and `removefields` params in url querystring will work with these.
- Use laravel [eloquent model `$appends`](https://laravel.com/docs/6.x/eloquent-serialization#appending-values-to-json) property to automatically include custom attribute accessors.

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

[](#relationships)

- Using the relationships defined in your models, you can pass a comma delimited list eg `include=join1,join2` which will return those joins (one or many).

Simply add a `protected static $mapResources` to your `Resource` to define which resources to assign your related data. E.e., for a one to many relationship, you should specify a collection, and a one-to-one relationship specify the related resource directly. This will allow the API to properly format the related record.

```
    protected static $mapResources = [
        'notes' => NotesCollection::class,
        'owner' => OwnerResource::class
    ];

```

- You can automatically update and create related records for most types of relationships. Just include the related resource name in your POST or PUT request.

For `BelongsToMany` or `MorphToMany` relationships, you can choose the sync strategy. By default, this will take an *additive* strategy. That is to say, related records sent will be ADDED to any existing related records. On a request-by-request basis, you can opt for a *sync* strategy which will remove the pivot for any related records not listed in the request. Note the actual related record will not be removed, just the pivot entry.

To opt for the *sync* behavaiour, set `?sync[field]=true` in your request.

Sorting
-------

[](#sorting)

- Sorts can be passed as comma list aswell, ie `sort=age asc` or `sort=age asc,name desc,eyes` - generates sql of `sort age asc` and `sort age asc, name desc, eyes asc` respectively
- Default sort can also be added on the controller using by overrideing the `protected $defaultSort = null;` parameter

Pagination
----------

[](#pagination)

- pagination can be enabled/disbled on the controller by overriding the `protected $defaultLimit = 25;` on the controller
- pagination can also be passed via the url using `limit=xx&page=y`
- pagination can also be limited to a max per page by overriding the `protected $maximumLimit = false;` parameter

Validation
----------

[](#validation)

- When Posting a new record, validation can be done by adding a `rulesForCreate` method to your controller returning an array eg

```
[
    'email' => 'required|email',
    'games' => 'required|numeric',
]
```

see

- for updating a record, add a method `rulesForUpdate` per above.

Defaults
--------

[](#defaults)

The following parameters are set in the Base Api controller and can be overwritten by your Controller on a case by case basis:

- **DEPRECATED** `protected $resourceKeySingular = 'data';`
- **DEPRECATED** `protected $resourceKeyPlural = 'data';`
- `protected $resourceSingle = JsonResource::class;` Collection to use for your single resource
- `protected $resourceCollection = ResourceCollection::class;` Collection to use for your resource collection
- `protected $defaultFields = ['*'];` Default Fields to respond with
- `protected $defaultSort = null;` Set the default sorting for queries.
- `protected $defaultLimit = 25;` Number of items displayed at once if not specified. (0 = maximumLimit)
- `protected $maximumLimit = 0;` Maximum limit that can be set via $\_GET\['limit'\]. - this ties in with the defaultLimit aswell, and if wanting to disable pagination , both should be 0. ) will allow all records to be returned in a single call.
- `protected $unguard = false;` Do we need to unguard the model before create/update?

Scopes
------

[](#scopes-1)

### SoftDeleted Records

[](#softdeleted-records)

add the `Phpsa\LaravelApiController\Model\Scopes\WithSoftDeletes` trait to your model, add to your resource file:

```
class MyModelResource extends ApiResource
{

 protected static $allowedScopes = [
        'withTrashed',
        'onlyTrashed'
    ];
```

you can now append `withTrashed=1` or `onlyTrashed=1` to your query.

Responses
---------

[](#responses)

you can override responses for each point by overriding the following protected methods:

- handleIndexResponse
- handleStoreResponse
- handleShowResponse
- handleUpdateResponse
- handleDestroyResponse

Security
--------

[](#security)

If you discover any security related issues, please email instead of using the issue tracker.

Credits
-------

[](#credits)

- [Craig G Smith](https://github.com/phpsa)
- [Sam Sehnert](https://github.com/samatcd)
- [Phil Taylor](https://github.com/codeberry)
- [All contributors](https://github.com/phpsa/laravel-api-controller/graphs/contributors)

Sponsors
--------

[](#sponsors)

- [Custom D](https://customd.com)

###  Health Score

35

—

LowBetter than 80% of packages

Maintenance34

Infrequent updates — may be unmaintained

Popularity21

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity64

Established project with proven stability

 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.

###  Release Activity

Cadence

Every ~23 days

Recently: every ~62 days

Total

12

Last Release

647d ago

PHP version history (3 changes)2.0PHP ^8.0

2.9.2PHP &gt;=8.0

2.9.3PHP &gt;=8.0|&gt;=8.1|&gt;=8.2|&gt;=8.3

### Community

Maintainers

![](https://www.gravatar.com/avatar/36291d0ff9126e11641fe3805397bab26324f5514741f5b48b18fa8f183fdbd8?d=identicon)[camilo3rd](/maintainers/camilo3rd)

---

Top Contributors

[![camilord](https://avatars.githubusercontent.com/u/2794294?v=4)](https://github.com/camilord "camilord (3 commits)")

---

Tags

apilaravelcontroller

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/camilord-laravel-api-controller/health.svg)

```
[![Health](https://phpackages.com/badges/camilord-laravel-api-controller/health.svg)](https://phpackages.com/packages/camilord-laravel-api-controller)
```

###  Alternatives

[darkaonline/l5-swagger

OpenApi or Swagger integration to Laravel

2.9k34.0M112](/packages/darkaonline-l5-swagger)[knuckleswtf/scribe

Generate API documentation for humans from your Laravel codebase.✍

2.3k12.2M45](/packages/knuckleswtf-scribe)[nickurt/laravel-postcodeapi

Universal PostcodeApi for Laravel 11.x/12.x/13.x

97221.2k](/packages/nickurt-laravel-postcodeapi)[mozex/anthropic-laravel

Anthropic PHP for Laravel is a supercharged PHP API client that allows you to interact with the Anthropic API

71226.4k1](/packages/mozex-anthropic-laravel)[phpsa/laravel-api-controller

A laravel api base controller with basic CRUD mapped to the model

4860.6k5](/packages/phpsa-laravel-api-controller)[d-scribe/laraquick

A collection of classes to be extended/used in laravel applications for quick development

371.8k1](/packages/d-scribe-laraquick)

PHPackages © 2026

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