PHP code example of php-dev-umesh / laravel-api-response

1. Go to this page and download the library: Download php-dev-umesh/laravel-api-response 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/ */

    

php-dev-umesh / laravel-api-response example snippets


use PhpDevUmesh\LaravelApiResponse\Facades\ApiResponse;

// In any controller or route:
ApiResponse::success($user, 'user.found');
// → {success: true, status: 200, message: "User found", data: {...}}

ApiResponse::error('user.not_found', 404);
// → {success: false, status: 404, message: "User not found", data: null}

use PhpDevUmesh\LaravelApiResponse\Traits\ApiResponseTrait;

class UserController extends Controller
{
    use ApiResponseTrait;

    public function index()
    {
        return $this->paginated(User::paginate(), 'users.loaded');
    }

    public function store(StoreUserRequest $request)
    {
        return $this->created(User::create(...), 'user.created');
    }
}

'format' => [
    'success_key' => 'success',
    'status_key'  => 'status',
    'message_key' => 'message',
    'data_key'    => 'data',
],

ApiResponse::success($user, 'user.found');
ApiResponse::success($user, 'user.found', ['name' => $user->name]);
ApiResponse::created($user, 'user.created');
ApiResponse::ok($users);
ApiResponse::noContent();
ApiResponse::message('operation.completed');

ApiResponse::error('user.not_found', 404);
ApiResponse::error('Unauthorized', 401);
ApiResponse::validationError($validator->errors());

ApiResponse::paginated(User::paginate(), 'users.loaded');

// Standard format (config 'standard'):
// {success, status, message, data: [...], meta: {current_page, last_page, per_page, total, has_more, ...}}

// Flat format (config 'flat'):
// {success, status, message, data: [...], total_page: 10, next_page: "..."}

ApiResponse::resource(UserResource::class, $user);
ApiResponse::collection(UserResource::class, User::all());
ApiResponse::paginatedResource(UserResource::class, User::paginate(), 'users.loaded');

// Stream large dataset line-by-line (no memory spike)
ApiResponse::stream(function () {
    foreach (User::cursor() as $user) {
        echo json_encode(['id' => $user->id, 'name' => $user->name]) . "\n";
    }
}, 'exporting.users');

// Server-Sent Events for real-time progress
ApiResponse::sse(function ($emit) {
    foreach ($process as $step) {
        $emit(['progress' => $step / $total], 'progress');
        usleep(500000);
    }
    $emit(['message' => 'Complete'], 'complete');
});

// Lazy collection stream
ApiResponse::lazy(User::cursor(), 'exporting.users');

ApiResponse::download(storage_path('app/report.pdf'), 'report.pdf');
ApiResponse::file(storage_path('app/invoice.pdf'));
ApiResponse::streamDownload(function () {
    $handle = fopen('php://output', 'w');
    fputcsv($handle, ['Name', 'Email']);
    foreach (User::cursor() as $user) {
        fputcsv($handle, [$user->name, $user->email]);
    }
    fclose($handle);
}, 'users.csv');

ApiResponse::csv(
    headers: ['Name', 'Email', 'Score'],
    rows: User::cursor()->map(fn($u) => [$u->name, $u->email, $u->score]),
    filename: 'scores.csv'
);

ApiResponse::downloadFromDisk('s3', 'exports/report.pdf', 'report.pdf');

// config/api-response.php
'auto_translate' => true,
'lang_prefix'    => 'message.',
'lang_fallback'  => true,

// In your code — just pass the key:
ApiResponse::success($user, 'user.found');
// Automatically resolves to: __("message.user.found")
// If translation file has: "user.found" => "User found successfully"
// Response: { "message": "User found successfully" }

// With dynamic replacements:
ApiResponse::success($user, 'welcome_user', ['name' => 'Umesh']);
// Resolves to: __("message.welcome_user", ['name' => 'Umesh'])
// If lang file has: "welcome_user" => "Welcome, :name!"
// Response: { "message": "Welcome, Umesh!" }

// Fallback behavior:
// if "message.user.found" doesn't exist in lang files AND lang_fallback = true
// → uses "user.found" as the raw message

// Disable auto-translate:
'auto_translate' => false,
// Now strings pass through as-is: "user.found" → "user.found"

$text = api_trans('user.found', ['name' => 'Umesh']);

'lang_replace' => ['app_name' => 'MyApp'],
// Merged with any per-call replacements



namespace App\Exceptions;

use PhpDevUmesh\LaravelApiResponse\Exceptions\RendersApiExceptions;
use Throwable;

class Handler extends ExceptionHandler
{
    use RendersApiExceptions;

    public function render($request, Throwable $e)
    {
        // Try API rendering first, fall back to Laravel's default
        return $this->renderApiException($request, $e) ?? parent::render($request, $e);
    }
}

use PhpDevUmesh\LaravelApiResponse\Exceptions\HandlerRegister;

return Application::configure(basePath: dirname(__DIR__))
    ->withExceptions(function ($exceptions) {
        HandlerRegister::register($exceptions);
    })
    // ...
    ->create();

use PhpDevUmesh\LaravelApiResponse\Exceptions\ApiException;

throw ApiException::make('user.not_found', 404);
throw ApiException::validationFailed($validator->errors());
throw ApiException::notFound('User');
throw ApiException::serverError('Something went wrong');

// Guard methods (throw on condition):
ApiException::throwIf($user->isBanned(), 'Account blocked', 403);
ApiException::throwIfNotSave($user->save());
ApiException::throwIfEmpty($collection);

use PhpDevUmesh\LaravelApiResponse\Http\ApiFormRequest;

class StoreUserRequest extends ApiFormRequest
{
    public function rules(): array
    {
        return [
            'email' => '

// In routes/api.php:
Route::middleware('api-response')->group(function () {
    Route::get('/users', function () {
        return response()->json(['id' => 1, 'name' => 'John']);
        // Automatically wrapped to:
        // {success: true, status: 200, message: "", data: {id: 1, name: "John"}}
    });
});



return [
    // Response JSON key names
    'format' => [
        'success_key' => 'success',
        'status_key'  => 'status',
        'message_key' => 'message',
        'data_key'    => 'data',
    ],

    // Default status codes
    'default_status_success' => 200,
    'default_status_error'   => 400,

    // Auto-translation settings
    'auto_translate' => true,         // Auto-run messages through __()
    'lang_prefix'    => 'message.',   // Translation file prefix
    'lang_fallback'  => true,         // Use raw key if no translation found
    'lang_replace'   => [],           // Global replacement defaults

    // Pagination format
    'pagination' => [
        'format' => 'standard',       // 'standard' or 'flat'
        'keys' => [
            'current_page'  => 'current_page',
            'last_page'     => 'last_page',
            'per_page'      => 'per_page',
            'total'         => 'total',
            'has_more'      => 'has_more',
            'next_page_url' => 'next_page_url',
            'prev_page_url' => 'prev_page_url',
        ],
    ],

    // Streaming
    'stream' => [
        'format'     => 'ndjson',
        'chunk_size' => 100,
    ],

    // Downloads
    'download' => [
        'delete_after_send' => false,
        'max_file_size'     => 100,  // MB
    ],

    // Exception handling
    'exception_handling' => [
        'api_prefix'  => 'api/*',
        'debug_trace' => env('APP_DEBUG', false),
    ],

    // Predefined status codes (for reference, accessible via config)
    'status_codes' => [
        'OK'                => 200,
        'CREATED'           => 201,
        'NO_CONTENT'        => 204,
        'BAD_REQUEST'       => 400,
        'UNAUTHORIZED'      => 401,
        'FORBIDDEN'         => 403,
        'NOT_FOUND'         => 404,
        'METHOD_NOT_ALLOWED' => 405,
        'CONFLICT'          => 409,
        'UNPROCESSABLE'     => 422,
        'TOO_MANY_REQUESTS' => 429,
        'SERVER_ERROR'      => 500,
    ],
];

config('api-response.status_codes.CREATED');       // 201
config('api-response.format.success_key');          // 'success'
config('api-response.pagination.format');           // 'standard'



use PhpDevUmesh\LaravelApiResponse\Facades\ApiResponse;
use PhpDevUmesh\LaravelApiResponse\ApiResponseServiceProvider;

class ResponseBuilderTest extends Orchestra\Testbench\TestCase
{
    protected function getPackageProviders($app)
    {
        return [ApiResponseServiceProvider::class];
    }

    /** @test */
    public function it_returns_success_response()
    {
        $response = ApiResponse::success(['name' => 'John'], 'user.found');

        $response->assertStatus(200);
        $response->assertJson([
            'success' => true,
            'status' => 200,
            'message' => 'user.found',
            'data' => ['name' => 'John'],
        ]);
    }
}
json
{
    "repositories": [
        { "type": "composer", "url": "https://composer.pkg.github.com/php-dev-umesh" }
    ],
    "
bash
php artisan vendor:publish --tag=api-response-config