Skip to content
/ aapje.php Public

A lightweight, single-file PHP framework for building simple APIs.

License

Notifications You must be signed in to change notification settings

ssl/aapje.php

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Nov 30, 2024
8e5b369 Β· Nov 30, 2024

History

22 Commits
Nov 30, 2024
Nov 30, 2024
Nov 30, 2024
Nov 30, 2024
Nov 25, 2024
Nov 25, 2024

Repository files navigation

aapje.php

aapje.php is a lightweight, single-file PHP framework designed for building simple and efficient APIs. It offers essential features such as routing, database interactions, middleware support, CORS handling, and utility helper functions, all while maintaining a minimalistic and easy-to-use structure.



⚠️ aapje.php is currently in beta. bugs or other issues can be expected. do not use in production. ⚠️

πŸš€ Features

  • Routing: Define routes with dynamic parameters supporting various HTTP methods.
  • Database Integration: Simplified PDO-based database interactions with CRUD operations.
  • Middleware Support: Execute custom logic before or after route handling.
  • CORS Support: Built-in Cross-Origin Resource Sharing configuration for secure API access.
  • Helpers Class: Utility functions to streamline common tasks.
  • Single-File Architecture: Easy setup and deployment without external dependencies.

πŸ“¦ Installation

  1. Download aapje.php

  2. Include in Your Project:

    Place aapje.php in your project directory and include it in your PHP scripts.

    <?php
    require 'aapje.php';
  3. Web Server Configuration:

    Ensure that all requests to your website (or specific folder) using aapje.php are passed through your routing file.

    # Example Apache .htaccess file
    RewriteEngine On
    RewriteRule ^(.*)$ index.php [L]

Alternatively, you can fork or clone this repository, sync it to a web host, and directly start coding your API inside the index.php file.

πŸ› οΈ Configuration

Configuration is optional and aapje.php can operate without a database. CORS is disabled by default. When enabling CORS by setting 'enabled' to true, the origins, headers, and methods will default to '*' unless explicitly specified.

Configure aapje.php using the setConfig method. You can set database credentials, CORS settings, and default headers.

aapje::setConfig([
    'database' => [
        'host' => 'localhost',
        'dbname' => 'your_database',
        'user' => 'your_username',
        'password' => 'your_password',
    ],
    'cors' => [
        'enabled' => true,
        'origins' => ['https://example.com', 'https://example.org'], // Allowed origins
        'methods' => ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'], // Allowed methods
        'headers' => ['Content-Type', 'Authorization'], // Allowed headers
        'credentials' => true, // Allow credentials
    ],
    'default_headers' => [
        'X-Powered-By' => 'aapje.php',
    ],
]);

πŸ“š Usage

1. Defining Routes

Define routes using the route method, specifying the HTTP method, URL pattern, and callback function.

// Responds to all HTTP methods
aapje::route('*', '/', function () {
    aapje::response()->echo(['message' => 'Welcome to aapje.php!']);
});

// GET route with dynamic parameter
aapje::route('GET', '/user/@id', function ($id) {
    $user = aapje::select('users', '*', ['id' => $id]);
    if ($user) {
        aapje::response()->echo($user);
    } else {
        aapje::response()->statusCode(404)->echo(['error' => 'User not found']);
    }
});

2. Using Middleware

Register middleware functions to execute custom logic before route handling, such as logging or authentication.

// Define a middleware function
function loggingMiddleware($request, $response) {
    $method = $_SERVER['REQUEST_METHOD'];
    $uri = $_SERVER['REQUEST_URI'];
    $ip = $request->ip();
    error_log("[$method] $uri from $ip");
}

// Register the middleware
aapje::middleware('loggingMiddleware');

3. Utilizing Helpers

Use the Helpers class for common utility functions like escaping HTML or handling files.

aapje::route('GET', '/escape', function () {
    $unsafeString = '<script>alert("XSS")</script>';
    $safeString = Helpers::esc($unsafeString);
    aapje::response()->echo(['escaped' => $safeString]);
});

4. Handling CORS

CORS settings are managed via the setConfig method. When enabled, aapje.php automatically sets the necessary headers and handles preflight OPTIONS requests.

aapje::setConfig([
    'cors' => [
        'enabled' => true,
        'origins' => ['https://example.com'], // Allowed origins
        'methods' => ['GET', 'POST'], // Allowed HTTP methods
        'headers' => ['Content-Type', 'Authorization'], // Allowed headers
        'credentials' => true, // Allow credentials
    ],
]);

// Example route to test CORS
aapje::route('*', '/cors-test', function () {
    aapje::response()->echo(['message' => 'CORS is configured properly!']);
});

5. Database Operations

Perform CRUD operations using built-in methods. Below is an example that demonstrates creating, reading, updating, and deleting a user, along with setting custom headers and handling advanced database queries like sorting and limiting results.

// Create a new user
aapje::route('POST', '/user', function () {
    $input = aapje::request()->input();
    $data = [
        'name' => $input['name'] ?? null,
        'email' => $input['email'] ?? null,
    ];

    if (!$data['name'] || !$data['email']) {
        aapje::response()->statusCode(400)->echo(['error' => 'Name and email are required']);
    }

    try {
        $id = aapje::insert('users', $data);
        aapje::response()->statusCode(201)->echo(['created_user_id' => $id]);
    } catch (Exception $e) {
        aapje::response()->statusCode(500)->echo(['error' => 'Failed to create user']);
    }
});

// Retrieve all users with sorting and limit
aapje::route('GET', '/users', function () {
    $users = aapje::selectAll('users', '*', [], [
        'orderBy' => 'name',
        'sort' => 'ASC',
        'limit' => 10
    ]);
    aapje::response()->header('X-Custom-Header', 'CustomValue')->echo($users);
});

// Update a user
aapje::route('PUT', '/user/@id', function ($id) {
    $input = aapje::request()->input();
    $data = [
        'name' => $input['name'] ?? null,
        'email' => $input['email'] ?? null,
    ];

    if (!$data['name'] && !$data['email']) {
        aapje::response()->statusCode(400)->echo(['error' => 'At least one of name or email is required']);
    }

    try {
        aapje::update('users', $data, ['id' => $id]);
        aapje::response()->echo(['message' => 'User updated successfully']);
    } catch (Exception $e) {
        aapje::response()->statusCode(500)->echo(['error' => 'Failed to update user']);
    }
});

// Delete a user
aapje::route('DELETE', '/user/@id', function ($id) {
    try {
        aapje::delete('users', ['id' => $id]);
        aapje::response()->echo(['message' => 'User deleted successfully']);
    } catch (Exception $e) {
        aapje::response()->statusCode(500)->echo(['error' => 'Failed to delete user']);
    }
});

For more comprehensive examples, refer to the examples.php file in the repository.

πŸ”§ API Reference

aapje Class

  • setConfig(array $config)

    Set global configuration options.

  • route(string $method, string $pattern, callable $callback)

    Define a new route.

  • middleware(callable $callback)

    Register a middleware function.

  • run()

    Start processing incoming requests.

  • Database Methods:

    • insert(string $table, array $data): Insert a new record.
    • update(string $table, array $data, array $conditions = []): Update existing records.
    • delete(string $table, array $conditions = []): Delete records.
    • select(string $table, $columns = '*', array $conditions = [], array $options = []): Select a single record.
    • selectAll(string $table, $columns = '*', array $conditions = [], array $options = []): Select multiple records.

Request Class

  • header(string $key): ?string: Retrieve a specific request header.
  • headers(): array: Get all request headers.
  • input(bool $decode = true, bool $associative = true): Get JSON input from the request body.
  • getParam(string $key): ?string: Retrieve a specific GET parameter.
  • getParams(): array: Get all GET parameters.
  • postParam(string $key): ?string: Retrieve a specific POST parameter.
  • postParams(): array: Get all POST parameters.
  • ip(): string: Get the client's IP address.
  • userAgent(): ?string: Get the client's User-Agent.

Response Class

  • header(string $key, string $value): self: Set a response header.
  • headers(array $headers): self: Set multiple response headers.
  • cookie(string $name, string $value, array $options = []): self: Set a cookie.
  • cookies(array $cookies): self: Set multiple cookies.
  • statusCode(int $code): self: Set the HTTP status code.
  • echo($content, bool $json = true): Send the response to the client.

Helpers Class

  • esc(string $string): string: Escape HTML special characters.
  • getFile(string $file): string: Get the contents of a file.
  • putFile(string $file, string $content): void: Write content to a file.

πŸ“„ License

aapje.php is open-source software licensed under the MIT License.


Feel free to contribute to aapje.php by submitting issues or pull requests.

About

A lightweight, single-file PHP framework for building simple APIs.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages