Skip to content
/ dumbo Public

A lightweight, friendly PHP framework for HTTP.

License

Notifications You must be signed in to change notification settings

notrab/dumbo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

d79c08e · Jan 24, 2025
Oct 22, 2024
Jan 24, 2025
Jan 24, 2025
Oct 19, 2024
Aug 28, 2024
Oct 19, 2024
Oct 19, 2024
Oct 19, 2024
Oct 22, 2024
Oct 21, 2024
Aug 14, 2024
Sep 5, 2024
Jul 15, 2024

Repository files navigation

Dumbo

Dumbo

A lightweight, friendly PHP framework for HTTP — Inspired by Hono.

Discord Contributors Total downloads Examples

Features

  • 🚀 Lightweight and fast
  • 🧩 Middleware support
  • 🛣️ Flexible routing with parameters
  • 🔒 Built-in security features (CSRF, JWT)
  • 🍪 Cookie management
  • 📅 Date helpers
  • 🔍 Request ID for tracing
  • 📁 Static file serving
  • 🔐 Basic and Bearer authentication
  • 📝 Logging support
  • 🗃️ HTTP caching
  • 🔄 CORS support
  • 🧬 Environment-based configuration

Install

composer require notrab/dumbo

Quickstart

Here's a basic example of how it works!

<?php

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

use Dumbo\Dumbo;

$app = new Dumbo();

$app->use(function ($context, $next) {
    $context->set('message', 'Hello from middleware!');
    return $next($context);
});

$app->get('/', function ($context) {
    return $context->json([
        'message' => $context->get('message'),
        'timestamp' => time()
    ]);
});

$app->get('/users/:id', function ($context) {
    $id = $context->req->param('id');
    return $context->json(['userId' => $id]);
});

$app->post('/users', function ($context) {
    $body = $context->req->body();
    return $context->json($body, 201);
});

$app->run();

See the examples directory for more quickstarts.

License

Dumbo is open-sourced software licensed under the MIT license.

Contributors

Contributors

Documentation

Routing

<?php

$app->get('/users', function($context) { /* ... */ });
$app->post('/users', function($context) { /* ... */ });
$app->put('/users/:id', function($context) { /* ... */ });
$app->delete('/users/:id', function($context) { /* ... */ });

Params

<?php

$app->get('/users/:id', function($context) {
    $id = $context->req->param('id');

    return $context->json(['id' => $id]);
});

Nested

<?php

$nestedApp = new Dumbo();

$nestedApp->get('/nested', function($context) {
    return $context->text('This is a nested route');
});

$app->route('/prefix', $nestedApp);

Context

<?php

$app->get('/', function($context) {
    $pathname = $context->req->pathname();
    $routePath = $context->req->routePath();
    $queryParam = $context->req->query('param');
    $tags = $context->req->queries('tags');
    $body = $context->req->body();
    $userAgent = $context->req->header('User-Agent');
});

Response

<?php

return $context->json(['key' => 'value']);
return $context->text('Hello, World!');
return $context->html('<h1>Hello, World!</h1>');
return $context->redirect('/new-url');

Middleware

<?php

$app->use(function($context, $next) {
    $response = $next($context);

    return $response;
});

Custom context

<?php

$app = new Dumbo();

// Set configuration values
$app->set('DB_URL', 'mysql://user:pass@localhost/mydb');
$app->set('API_KEY', 'your-secret-key');
$app->set('DEBUG', true);

// Get configuration values
$dbUrl = $app->get('DB_URL');
$apiKey = $app->get('API_KEY');
$debug = $app->get('DEBUG');

// Use configuration in your routes
$app->get('/api/data', function(Context $context) {
    $apiKey = $context->get('API_KEY');

    // Use $apiKey in your logic...
    return $context->json(['message' => 'API key is set']);
});

$app->run();