Routing & Dispatching

Simple Implementation

Routers

This class can be used to add routes and what that route will do. For example:

$router = new Router();
$router->get('foo', function() { echo "GET foo\n"; });
<?php

class Router {

    private $routes = [
        'get' => [],
        'post' => []
    ];

    function get($pattern, callable $handler) {
        $this->routes['get'][$pattern] = $handler;
        return $this;
    }

    function post($pattern, callable $handler) {
        $this->routes['post'][$pattern] = $handler;
        return $this;
    }

    function match(Request $request) {
        $method = strtolower($request->getMethod());
        if (!isset($this->routes[$method])) {
            return false;
        }

        $path = $request->getPath();
        foreach ($this->routes[$method] as $pattern => $handler) {
            if ($pattern === $path) {
                return $handler;
            }
        }

        return false;
    }

}

Requests

This class is used to handle requests, and return methods and paths.

<?php

class Request {

    private $method;
    private $path;

    function __construct($method, $path) {
        $this->method = $method;
        $this->path = $path;
    }

    function getMethod() {
        return $this->method;
    }

    function getPath() {
        return $this->path;
    }

Dispatchers

$dispatcher = new Dispatcher($router);

$dispatcher->handle(new Request('GET', 'foo'));
<?php

class Dispatcher {

    private $router;

    function __construct(Router $router) {
        $this->router = $router;
    }

    function handle(Request $request) {
        $handler = $this->router->match($request);
        if (!$handler) {
            echo "Could not find your resource!\n";
            return;
        }

        $handler();
    }

}
  1. Add route using router class function GET and POST.

  2. The dispatcher will use router class, and MATCH with the routes from REQUEST.

  3. If there is a route, the function or handler will be ran.

References

Last updated