Creating robust RESTful APIs in PHP requires careful planning and adherence to best practices. Here’s how to build professional-grade APIs.

Basic API Structure

// public/index.php
require __DIR__ . '/../vendor/autoload.php';

$request = Laminas\Diactoros\ServerRequestFactory::fromGlobals();
$router = new League\Route\Router;

$router->map('GET', '/api/products', [ProductController::class, 'index']);
$router->map('POST', '/api/products', [ProductController::class, 'create']);

$response = $router->dispatch($request);
(new Laminas\HttpHandlerRunner\Emitter\SapiEmitter)->emit($response);

RESTful Design Principles

  • Use HTTP methods properly (GET, POST, PUT, PATCH, DELETE)
  • Return appropriate HTTP status codes
  • Version your API (e.g., /api/v1/products)
  • Use plural nouns for resources (/products not /product)
  • Support filtering, sorting, and pagination

Response Formatting

class ApiResponse {
    public static function success($data, int $code = 200) {
        return new JsonResponse([
            'success' => true,
            'data' => $data
        ], $code);
    }

    public static function error(string $message, int $code = 400) {
        return new JsonResponse([
            'success' => false,
            'error' => $message
        ], $code);
    }
}

Authentication

Common API authentication methods:

// JWT Authentication Middleware
class AuthMiddleware implements MiddlewareInterface {
    public function process(
        ServerRequestInterface $request, 
        RequestHandlerInterface $handler
    ): ResponseInterface {
        if (!$request->hasHeader('Authorization')) {
            return ApiResponse::error('Unauthorized', 401);
        }
        
        // Validate JWT token
        return $handler->handle($request);
    }
}

Documentation

Always document your API with:

  • Endpoint descriptions
  • Request/response examples
  • Authentication requirements
  • Error responses

Tools like OpenAPI/Swagger can automate documentation generation.

By Admin

Leave a Reply

Your email address will not be published. Required fields are marked *