<?php
session_start();
include __DIR__ . "/../src/matrix.php";
use divengine\matrix;
// Simple router implementation
function isLogged()
{
return isset($_SESSION['logged']) && $_SESSION['logged'] == true;
}
function matchRoute($route)
{
$uri = $_SERVER['REQUEST_URI'] ?? "";
if ($route == "*")
return true;
$uri = str_replace(basename(__FILE__), "", $uri);
return $route == $uri;
}
$context = new matrix([
["Variable", "Data"],
["is_logged", fn () => isLogged()]
]);
$F_MATCH = fn ($r, $c, $m) => matchRoute($m->{$r});
$F_PASS = fn ($r, $c, $m) => ($context->{1.1} || $m->{$r + .2}) && $m->{$r + .3};
$F_HANDLER = fn ($r, $c, $m) => $m->{$r + .4} ? $m->{$r + .1} : 'login';
$F_HANDLER_PATH = fn ($r, $c, $m) => __DIR__ . "/handlers/{$m->{$r + .5}}.php";
$F_LISTENER = fn ($r, $c, matrix $m) => $m->{$r + .3} ? (require($m->{$r + .6}))() : null;
$F_NOTHING_MATCH = fn($r, $c, matrix $m) => array_reduce($m->vertical($c, 1, $r - 2), fn ($x, $i) => $x && !$i, true);
$routes = [
["Route", "Controller", "Public", "Match", "Pass", "Handler", "Handler Path", "Listener", 'caption' => ""],
// -------------------------------------------------------------------------------------------------------------------------
["/", "home", true, $F_MATCH, $F_PASS, $F_HANDLER, $F_HANDLER_PATH, $F_LISTENER, 'caption' => "Home"],
["/about", "about", true, $F_MATCH, $F_PASS, $F_HANDLER, $F_HANDLER_PATH, $F_LISTENER, 'caption' => "About"],
["/login", "login", true, $F_MATCH, $F_PASS, $F_HANDLER, $F_HANDLER_PATH, $F_LISTENER, 'caption' => "Login"],
["/admin", "admin", false, $F_MATCH, $F_PASS, $F_HANDLER, $F_HANDLER_PATH, $F_LISTENER, 'caption' => "Admin"],
// -----------------------------------------------------------------------------------------------------
["*", "log", true, $F_MATCH, $F_PASS, $F_HANDLER, $F_HANDLER_PATH, $F_LISTENER, 'caption' => ""],
["*", "404", true, $F_NOTHING_MATCH, $F_PASS, $F_HANDLER, $F_HANDLER_PATH, $F_LISTENER, 'caption' => ""]
];
// print menu
echo "<p>". array_reduce($routes, function ($x, $route) {
$caption = $route['caption'] ?? '';
$path = $route[0];
if ($caption == "")
return $x;
return $x . "<a href='$path'>$caption</a> | ";
}, "") . "</p>";
$router = new matrix($routes);
echo "<script>console.log(" . $router->formatJSON(true) . ");</script>";
|