<?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>"; 
 
 |