mu

The 4-LOC µ (mu) PHP Microframework. Just cuz.

  • Owner: jeremeamia/mu
  • Platform:
  • License:: MIT License
  • Category::
  • Topic:
  • Like:
    0
      Compare:

Github stars Tracking Chart

The µ PHP Microframework

Code Climate

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 µ.

Check out the code!

Features

These 4 LOC come jam-packed with features!

Easy, regex-based routing system

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();

Simple, but powerful, dependency injection container

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();

A truly elegant and fluent interface

See previous example (I'm lazy).

Built-in templating system, free of {}

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('views', __DIR__ . '/templates')
    ->any('/hello/(?<name>\w+)', function ($app, $params) {
        return $app->view('hello', [
            'greeting' => 'howdy',
            'name'     => $params['name'],
        ]);
    })
    ->run();

No twigs, plates, or blades to cut you or poke you.

Design constraints

  • Must have at least a Router, Container, and Templating System as features.
  • Must attempt to incorporate usage patterns (e.g., chainable methods, closures
    as controllers) that resemble other contemporary microframeworks.
  • Must work with error_reporting set to -1 (all errors reported).
  • Must not exceed 4 lines of code (LOC), where each line is <= 120 characters.
  • Must not have dependencies on other packages.
  • May break traditional coding conventions for the sake of brevity.
  • Must be hand-written.

It works, but it's really just a joke.

Don't use this in production, or really anywhere. It's just for fun. :smile:

If you want to use a production-quality microframework, try one of these:

Is there a PHP 7 Version?

Not yet. Waiting for 7.4 with shorthand closures before I attempt anything.

Overview

Name With Ownerjeremeamia/mu
Primary LanguagePHP
Program languagePHP (Language Count: 1)
Platform
License:MIT License
Release Count2
Last Release Name2.0.0 (Posted on )
First Release Name1.0.0 (Posted on )
Created At2015-04-15 22:23:26
Pushed At2023-03-27 20:46:18
Last Commit At2023-03-27 13:39:25
Stargazers Count279
Watchers Count11
Fork Count11
Commits Count27
Has Issues Enabled
Issues Count5
Issue Open Count0
Pull Requests Count3
Pull Requests Open Count0
Pull Requests Close Count3
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private
To the top