路由分发:
路由分发,主要是根据url的信息,调用指定的控制器和方法,
根据$_SERVER[‘REQUEST_URI’]的信息,分割出controller 和action
<?php
final class Router
{
private $url;
public static $controller;
public static $action;
private static $instance;
public static function getInstance()
{
if (!self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
public function __construct()
{
$this->url = $_SERVER['REQUEST_URI'];
}
public function dispatch()
{
$url = parse_url($this->url);
$url_arr = explode('/', $url['path']);//应为按'/'分离出来的,第一个字符是'/',所以多出一个空串,去除第一个空数组
if ($url_arr[1] !== 'index.php') {
die('please load index.php');
}
$counts = is_null($url_arr) ? 0 : count($url_arr);
if ($counts == 2) {
self::$controller = 'index';
self::$action = 'index';
$this->load();
} elseif ($counts == 3) {
self::$controller = 'index';
self::$action = $url_arr[2];
$this->load();
} elseif ($counts == 4) {
self::$controller = $url_arr[2];
self::$action = $url_arr[3];
$this->load();
} else {
die('wrong router formation ' . InternalResponseCode::EXPECTED_FAIL);
}
}
private function load()
{
$controller_name = self::$controller . 'Controller';
$action_name = self::$action . 'Action';
$controller = new $controller_name();
if (method_exists($controller, $action_name)) {
if (!is_callable(array($controller, $action_name))) {
die($action_name . ' is not callable in ' . $controller_name);
} else {
$controller->$action_name();
}
} else {
die($action_name . 'not found in' . $controller_name);
}
}
}