1. Go to this page and download the library: Download libinkk/api-starter library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
use Libinkk\ApiStarter\Facades\Api;
use Libinkk\ApiStarter\Filters\AllowedFilter;
use Libinkk\ApiStarter\Support\ApiQuery;
use App\Models\User;
public function index()
{
$users = ApiQuery::for(User::class)
->allowedFilters([
'status',
AllowedFilter::partial('name'),
])
->allowedSearch(['name', 'email'])
->allowedSorts(['name', 'created_at'])
->allowedFields(['id', 'name', 'email', 'status'])
->allowedIncludes(['posts'])
->defaultSort('-created_at')
->paginate();
return Api::success($users, 'Users fetched successfully');
}
public function store(StoreUserRequest $request)
{
$user = User::create($request->validated());
return Api::created($user, 'User created successfully');
}
'response' => [
'
use Libinkk\ApiStarter\Facades\Api;
Api::success($data, 'OK');
Api::created($data, 'Created');
Api::updated($data, 'Updated');
Api::deleted('Deleted');
Api::validation($errors, 'Validation failed');
Api::error('Something went wrong', 400, [], [], 'ERR_001');
use Libinkk\ApiStarter\Exceptions\ApiException;
throw new ApiException(
message: 'Payment
'features' => [
'exceptions' => true,
],
return Api::validation([
'email' => ['The email field is
use Libinkk\ApiStarter\Support\ApiQuery;
use Libinkk\ApiStarter\Traits\ApiQueryable;
// Option A: static helper
ApiQuery::for(User::class)
// Option B: model trait
class User extends Model
{
use ApiQueryable;
}
User::apiQuery()
use Libinkk\ApiStarter\Filters\AllowedFilter;
ApiQuery::for(User::class)
->allowedFilters([
'status', // exact match
AllowedFilter::partial('name'), // LIKE %value%
AllowedFilter::boolean('is_active'), // true/false/1/0
AllowedFilter::between('price'), // 10,100
AllowedFilter::dateRange('created_at'),
AllowedFilter::callback('vip', function ($query, $value) {
if (filter_var($value, FILTER_VALIDATE_BOOLEAN)) {
$query->where('price', '>=', 80);
}
}),
AllowedFilter::exact('role_id', 'roles.id'), // map request key -> column
])
->get();
use Libinkk\ApiStarter\Contracts\SearchDriver;
class FullTextSearchDriver implements SearchDriver
{
public function apply($query, string $term, array $columns): void
{
// your full-text logic
}
}
ApiQuery::for(User::class)
->allowedSearch(['name', 'email'], new FullTextSearchDriver())
->get();
use Libinkk\ApiStarter\Sorts\AllowedSort;
ApiQuery::for(User::class)
->allowedSorts([
'name',
'created_at',
AllowedSort::field('email'),
AllowedSort::callback('price_rank', function ($query, $direction) {
$query->orderBy('price', $direction);
}),
])
->defaultSort('-created_at')
->get();
use Libinkk\ApiStarter\Support\ErrorCode;
ErrorCode::message(ErrorCode::FORBIDDEN);
// localized: "This action is unauthorized." / Tamil / German / etc.
return Api::error(
ErrorCode::message('USER_001', [], 'User account is suspended.'),
403,
[],
[],
'USER_001'
);
'error_codes' => [
'messages' => [
'USER_001' => 'User account is suspended.',
'ORDER_101' => 'Order cannot be cancelled.',
],
],
// lang/en/errors.php (published) or package lang files
'USER_001' => 'User account is suspended.',
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Libinkk\ApiStarter\Traits\ApiQueryable;
class User extends Model
{
use ApiQueryable;
protected $fillable = ['name', 'email', 'status'];
public function posts()
{
return $this->hasMany(Post::class);
}
}
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\StoreUserRequest;
use App\Models\User;
use Libinkk\ApiStarter\Facades\Api;
use Libinkk\ApiStarter\Filters\AllowedFilter;
class UserController extends Controller
{
public function index()
{
$users = User::apiQuery()
->allowedFilters([
'status',
AllowedFilter::partial('name'),
AllowedFilter::boolean('is_active'),
])
->allowedSearch(['name', 'email'])
->allowedSorts(['name', 'created_at', 'email'])
->allowedFields(['id', 'name', 'email', 'status', 'created_at'])
->allowedIncludes(['posts'])
->defaultSort('-created_at')
->paginate();
return Api::success($users, 'Users fetched successfully');
}
public function store(StoreUserRequest $request)
{
$user = User::create($request->validated());
return Api::created($user);
}
public function show(User $user)
{
return Api::success($user, 'User fetched successfully');
}
public function update(StoreUserRequest $request, User $user)
{
$user->update($request->validated());
return Api::updated($user);
}
public function destroy(User $user)
{
$user->delete();
return Api::deleted();
}
}
use App\Http\Controllers\Api\UserController;
use Illuminate\Support\Facades\Route;
Route::prefix('api/v1')
->middleware(['api', 'api.performance', 'api.request-id', 'api.locale', 'api.version'])
->group(function () {
Route::apiResource('users', UserController::class);
});