A "real" microframework that fits in just 4 lines of code.
The microframeworks out there weren't micro enough for me, so I brushed up on some of my code golfing skills to create µ.
These 4 LOC come jam-packed with features!
Follows the well-established route-to-callable microframework pattern.
echo (new µ)
->get('/hello', function ($app) {
return "<p>Hello, world!</p>";
})
->run();
Allows you to access parameters from the URL.
echo (new µ)
->get('/hello/(?<name>\w+)', function ($app, $params) {
return "<p>Hello, {$params['name']}!</p>";
})
->run();
Supports all your favorite HTTP verbs.
echo (new µ)
->delete('/user/(?<id>\d+)', $fn)
->get('/user/(?<id>\d+)', $fn)
->head('/user/(?<id>\d+)', $fn)
->patch('/user/(?<id>\d+)', $fn)
->post('/users', $fn)
->put('/user/(?<id>\d+)', $fn)
->run();
Supports wildcard verbs too, because sometimes you are just making a web page and you really don't care about esoteric HTTP practices.
echo (new µ)
->any('/', $fn)
->run();
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
echo (new µ)
->cfg('log.channel', 'your-app')
->cfg('log.handler', function ($app) {
return new StreamHandler('path/to/your.log', Logger::WARNING);
})
->cfg('log', function ($app) {
$log = new Logger($app->cfg('log.channel'));
$log->pushHandler($app->cfg('log.handler'));
return $log;
})
->get('/hello/(?<name>\w+)', function ($app, $params) {
$app->cfg('log')->addDebug("Said hello to {$params['name']}.");
return "<p>Hello, {$params['name']}!</p>";
})
->run();
See previous example (I'm lazy).
Templates are just PHP files—no mustaches and no frills.
<!-- templates/hello.php -->
<html>
<head>
<title>World Greeter</title>
</head>
<body>
<p><?= ucfirst($greeting) ?>, <?= $name ?>!</p>
</body>
</html>
// index.php
echo (new µ)
->cfg('Ʋ', __DIR__ . '/templates')
->any('/hello/(?<name>\w+)', function ($app, $params) {
return $app->ʋ('hello', [
'greeting' => 'howdy',
'name' => $params['name'],
]);
})
->run();
No twigs, plates, or blades to cut you or poke you.
Don't use this in production, or really anywhere. It's just for fun. 😄
If you want to use a production-quality microframework, try one of these: