0) { foreach ($sym as $s) { $s = substr($s, 1); if (isset($cb_map[$s]) && isset($cb_or_val[$s])) call_user_func($cb_map[$s], $cb_or_val[$s]); } return; } error(500, 'bad call to filter()'); } function route_to_regex($route) { $route = preg_replace_callback('@:[\w]+@i', function ($matches) { $token = str_replace(':', '', $matches[0]); return '(?P<'.$token.'>[a-z0-9_\0-\.]+)'; }, $route); return '@^'.rtrim($route, '/').'$@i'; } function route($method, $pattern, $callback = null) { // callback map by request type static $route_map = array( 'GET' => array(), 'POST' => array() ); $method = strtoupper($method); if (!in_array($method, array('GET', 'POST'))) error(500, 'Only GET and POST are supported'); // a callback was passed, so we create a route defiition if ($callback !== null) { // create a route entry for this pattern $route_map[$method][$pattern] = array( 'xp' => route_to_regex($pattern), 'cb' => $callback ); } else { // callback is null, so this is a route invokation. look up the callback. foreach ($route_map[$method] as $pat => $obj) { // if the requested uri ($pat) has a matching route, let's invoke the cb if (!preg_match($obj['xp'], $pattern, $vals)) continue; // call middleware middleware($pattern); // construct the params for the callback array_shift($vals); preg_match_all('@:([\w]+)@', $pat, $keys, PREG_PATTERN_ORDER); $keys = array_shift($keys); $argv = array(); foreach ($keys as $index => $id) { $id = substr($id, 1); if (isset($vals[$id])) { array_push($argv, trim(urldecode($vals[$id]))); } } // call filters if we have symbols if (count($keys)) { filter(array_values($keys), $vals); } // if cb found, invoke it if (is_callable($obj['cb'])) { call_user_func_array($obj['cb'], $argv); } // leave after first match break; } } } function get($path, $cb) { route('GET', $path, $cb); } function post($path, $cb) { route('POST', $path, $cb); } function flash($key, $msg = null, $now = false) { static $x = array(), $f = null; $f = (config('cookies.flash') ? config('cookies.flash') : '_F'); if ($c = get_cookie($f)) $c = json_decode($c, true); else $c = array(); if ($msg == null) { if (isset($c[$key])) { $x[$key] = $c[$key]; unset($c[$key]); set_cookie($f, json_encode($c)); } return (isset($x[$key]) ? $x[$key] : null); } if (!$now) { $c[$key] = $msg; set_cookie($f, json_encode($c)); } $x[$key] = $msg; } function dispatch() { $path = $_SERVER['REQUEST_URI']; if (config('site.url') !== null) $path = preg_replace('@^'.preg_quote(site_path()).'@', '', $path); $parts = preg_split('/\?/', $path, -1, PREG_SPLIT_NO_EMPTY); $uri = trim($parts[0], '/'); $uri = strlen($uri) ? $uri : 'index'; route(method(), "/{$uri}"); } ?>