PHP code example of libinkk / api-starter

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/ */

    

libinkk / api-starter example snippets


$middleware->prependToGroup('api', [
        \Libinkk\ApiStarter\Http\Middleware\MeasurePerformance::class,
    ]);

    $middleware->appendToGroup('api', [
        \Libinkk\ApiStarter\Http\Middleware\AssignRequestId::class,
        \Libinkk\ApiStarter\Http\Middleware\SetLocale::class,
        \Libinkk\ApiStarter\Http\Middleware\SetApiVersion::class,
    ]);
})

Route::middleware(['api.performance', 'api.request-id', 'api.locale', 'api.version'])
    ->prefix('api')
    ->group(function () {
        //
    });

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();

'query' => [
    'filter_parameter' => 'filter', // ?filter[status]=active
],

ApiQuery::for(User::class)
    ->allowedSearch(['name', 'email'])
    ->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();

$users = ApiQuery::for(User::class)
    ->allowedSorts(['name'])
    ->paginate(); // respects ?page=&per_page=

return Api::success($users);

->simplePaginate();
->get();
->first();

'pagination' => [
    'page_parameter' => 'page',
    'per_page_parameter' => 'per_page',
    'default_per_page' => 15,
    'max_per_page' => 100, // hard cap
],

use Libinkk\ApiStarter\Pagination\Paginator;

Paginator::perPage();
Paginator::page();
Paginator::meta($paginator);
Paginator::links($paginator);

ApiQuery::for(User::class)
    ->allowedFields(['id', 'name', 'email', 'status'])
    ->paginate();

ApiQuery::for(User::class)
    ->allowedIncludes(['posts', 'roles', 'posts.comments'])
    ->paginate();

'request_id' => [
    'header' => 'X-Request-ID',
    'prefix' => 'REQ-',
    'attribute' => 'api_request_id',
],

Route::middleware(['api.performance', 'api.request-id', 'api.locale', 'api.version'])

'features' => [
    'performance' => true,
],

'performance' => [
    'header' => 'X-Response-Time',
    '

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.',

'localization' => [
    'supported' => ['en', 'ta', 'ml', 'hi', 'de', 'it', 'es', 'nl'],
    'fallback' => 'en',
    'header' => 'X-Locale',
    'query_parameter' => 'lang',
],

use Libinkk\ApiStarter\Versioning\ApiVersion;

ApiVersion::current();   // "v1"
ApiVersion::supported(); // ["v1", "v2"]

'versioning' => [
    'default' => 'v1',
    'supported' => ['v1', 'v2'],
    'header' => 'X-API-Version',
    'query_parameter' => 'api_version',
],

Route::prefix('api/v1')->middleware(['api.version'])->group(base_path('routes/api_v1.php'));
Route::prefix('api/v2')->middleware(['api.version'])->group(base_path('routes/api_v2.php'));

use App\Filters\StatusFilter;

ApiQuery::for(User::class)
    ->allowedFilters([new StatusFilter()])
    ->get();

'features' => [
    'response' => true,
    'filtering' => true,
    'sorting' => true,
    'search' => true,
    'pagination' => true,
    'tion' => true,
    'versioning' => true,
    'performance' => true,
],

'query' => [
    'filter_parameter' => null, // or 'filter'
    'search_parameter' => 'search',
    'sort_parameter' => 'sort',
    'fields_parameter' => 'fields',
    '

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);
    });

$response->assertOk()
    ->assertJsonPath('success', true)
    ->assertJsonStructure([
        'success',
        'status',
        'message',
        'data',
        'meta',
        'errors',
        'links',
        'request_id',
    ]);
bash
php artisan api-starter:install
bash
php artisan vendor:publish --tag=api-starter-config
php artisan vendor:publish --tag=api-starter-lang
bash
php artisan api-starter:doctor
bash
php artisan vendor:publish --tag=api-starter-lang