PHP code example of schentrup-software / php-api

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

    

schentrup-software / php-api example snippets



// index.php
;
use PhpApi\Model\RouterOptions;
use PhpApi\Model\SwaggerOptions;

$router = new Router(
    new RouterOptions(
        namespace: 'YourApp\\Routes',
        directory: __DIR__ . '/src/Routes',
    ),
    new SwaggerOptions(
        title: "Your API Documentation",
        apiVersion: "1.0.0",
    )
);

$router->route()->send();


// src/Routes/Get.php
namespace YourApp\Routes;

use PhpApi\Model\Response\AbstractJsonResponse;
use PhpApi\Swagger\Attribute\SwaggerTag;
use PhpApi\Swagger\Attribute\SwaggerDescription;

#[SwaggerTag(name: 'Hello', description: 'Hello world example')]
class Get
{
    #[SwaggerDescription('Returns a hello world message')]
    public function execute(): HelloResponse
    {
        return new HelloResponse();
    }
}

class HelloResponse extends AbstractJsonResponse
{
    public const ResponseCode = 200;

    public function __construct(
        public string $message = 'Hello, World!',
        public string $timestamp = '',
    ) {
        $this->timestamp = date('Y-m-d H:i:s');
    }
}


class GetUsers extends AbstractRequest
{
    public function __construct(
        #[QueryParam]
        public int $page = 1,
        #[QueryParam]
        public int $limit = 10
    ) {
    }
}


class CreateUserRequest extends AbstractRequest
{
    public function __construct(
        #[JsonRequestParam]
        public string $name,
    ) {
    }
}


#[JsonRequestParam]
class CreateUserRequest extends AbstractRequest
{
    public function __construct(
        public string $name,
    ) {
    }
}


class AuthenticatedRequest extends AbstractRequest
{
    public function __construct(
        #[HeaderRequestParam(name: 'Authorization')]
        public string $token
    ) {
    }
}


class SessionRequest extends AbstractRequest
{
    public function __construct(
        #[CookieRequestParam(name: 'session_id')]
        public ?string $sessionId = null
    ) {
    }
}


class AuthenticationMiddleware implements IRequestMiddleware
{
    public function handleRequest(AbstractRequest $request): AbstractRequest
    {
        if ($request instanceof AuthenticatedRequest) {
            // Validate token
            if (!$this->validateToken($request->token)) {
                throw new Exception('Invalid token');
            }
        }
        return $request;
    }

    private function validateToken(string $token): bool
    {
        // Token validation logic
        return true;
    }
}


class TimestampMiddleware implements IResponseMiddleware
{
    public function handleResponse(AbstractResponse $response): AbstractResponse
    {
        if (property_exists($response, 'timestamp') && !isset($response->timestamp)) {
            $response->timestamp = time();
        }
        return $response;
    }
}


$router = new Router($options);
$router->addMiddleware(new AuthenticationMiddleware());
$router->addMiddleware(new TimestampMiddleware());


// Custom 404 page
$router->handleNotFound('/error/404');

// Custom 404 response
$response = new Response();
$response->setCode(404);
$response->setContent('{"error": "Resource not found"}');
$router->handleNotFound($response);

// Custom handler with closure
$router->handleNotFound(function(Request $req) {
    $response = new Response();
    $response->setCode(404);
    $response->setContent("Could not find: " . $req->url->path);
    return $response;
});


#[SwaggerTag(name: 'Users', description: 'User management endpoints')]
class PostUser
{
    #[SwaggerSummary('Create a new user')]
    #[SwaggerDescription('Creates a new user with the provided information')]
    public function execute(CreateUserRequest $request): UserResponse
    {
        // Implementation
    }
}


// Maps to /users/{id}
class GetUsersId
{
    public function execute($_, int $id): UserResponse
    {
        return new UserResponse($id);
    }
}

composer