BlogPHP Router FunctionA self-contained SEF (search engine friendly) routing function, that supports both functions and class methods mapped to routes:
function serve($routemap) { function findRoute($routemap) { $tokens = array( ':string' => '([a-zA-Z]+)', ':number' => '([0-9]+)', ':alpha' => '([a-zA-Z0-9-_]+)' ); krsort($routemap); foreach ($routemap as $index => $action) { $pattern = strtr($index, $tokens); if (preg_match('#^/?' . $pattern . '/?$#', getUri(), $matches)) { return array($index, $matches); } } return null; } if ($result != null) { $action = $routemap[$result[0]]; $actions = explode('@', $action); $params = $result[1]; array_shift($params); if (count($actions) > 1) { die(call_user_func_array([new $actions[0], $actions[1]], $params)); } else { if (function_exists($actions[0])) { die(call_user_func_array($actions[0], $params)); } $class = $actions[0]; if (isset($actions[1]) == false AND class_exists($class)) { $method = count($params) > 0 ? $params[0] : 'home'; try { $reflectionMethod = new ReflectionMethod($class, $method); if ($reflectionMethod->isPublic() == true) { die($reflectionMethod->invokeArgs(new $class, $params)); } } catch (Exception $e) { } } } } die('404 - Page Not Found'); }
How to use: serve([ '/' => 'home', // using a function '/about/' => 'Application@about', // using method in a class '/admin/' => 'Admin', // using method in a class '/admin/:string' => 'Admin', // using method in a class '/admin/blog' => 'AdminBlog', // using method in a class '/admin/blog/:string' => 'AdminBlog', // using method in a class ]);
|