2015-05-22 12:36:26 -04:00
|
|
|
<?php
|
2015-06-16 11:11:35 -04:00
|
|
|
/**
|
|
|
|
* Routing logic
|
|
|
|
*/
|
2015-05-22 12:36:26 -04:00
|
|
|
|
|
|
|
use Aura\Router\RouterFactory;
|
|
|
|
|
2015-06-11 16:44:52 -04:00
|
|
|
/**
|
|
|
|
* Basic routing/ dispatch
|
|
|
|
*/
|
2015-05-22 12:36:26 -04:00
|
|
|
class Router {
|
|
|
|
|
2015-06-11 16:44:52 -04:00
|
|
|
/**
|
|
|
|
* The route-matching object
|
|
|
|
* @var object $router
|
|
|
|
*/
|
|
|
|
protected $router;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* The global configuration object
|
|
|
|
* @var object $config
|
|
|
|
*/
|
|
|
|
protected $config;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructor
|
|
|
|
*/
|
2015-05-22 12:36:26 -04:00
|
|
|
public function __construct()
|
|
|
|
{
|
2015-06-11 16:44:52 -04:00
|
|
|
global $config;
|
|
|
|
$this->config = $config;
|
|
|
|
|
2015-05-22 12:36:26 -04:00
|
|
|
$router_factory = new RouterFactory();
|
|
|
|
$router = $router_factory->newInstance();
|
|
|
|
$this->router = $router_factory->newInstance();
|
|
|
|
|
|
|
|
$this->_setup_routes();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the current route object, if one matches
|
|
|
|
*
|
|
|
|
* @return object
|
|
|
|
*/
|
|
|
|
public function get_route()
|
|
|
|
{
|
2015-06-11 16:44:52 -04:00
|
|
|
global $defaultHandler;
|
|
|
|
|
|
|
|
$raw_route = $_SERVER['REQUEST_URI'];
|
|
|
|
$route_path = str_replace([$this->config->anime_path, $this->config->manga_path], '', $raw_route);
|
|
|
|
$route_path = "/" . trim($route_path, '/');
|
|
|
|
|
|
|
|
$defaultHandler->addDataTable('Route Info', [
|
|
|
|
'route_path' => $route_path
|
|
|
|
]);
|
|
|
|
|
|
|
|
$route = $this->router->match($route_path, $_SERVER);
|
2015-05-22 12:36:26 -04:00
|
|
|
|
|
|
|
return $route;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Handle the current route
|
|
|
|
*
|
|
|
|
* @param [object] $route
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function dispatch($route = NULL)
|
|
|
|
{
|
2015-05-27 09:03:42 -04:00
|
|
|
global $defaultHandler;
|
|
|
|
|
2015-05-22 12:36:26 -04:00
|
|
|
if (is_null($route))
|
|
|
|
{
|
|
|
|
$route = $this->get_route();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( ! $route)
|
|
|
|
{
|
2015-05-27 09:03:42 -04:00
|
|
|
$failure = $this->router->getFailedRoute();
|
|
|
|
$defaultHandler->addDataTable('failed_route', (array)$failure);
|
|
|
|
|
2015-05-22 12:36:26 -04:00
|
|
|
$controller_name = 'BaseController';
|
|
|
|
$action_method = 'outputHTML';
|
|
|
|
$params = [
|
|
|
|
'template' => '404',
|
|
|
|
'data' => [
|
|
|
|
'title' => 'Page Not Found'
|
|
|
|
]
|
|
|
|
];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-06-17 08:50:01 -04:00
|
|
|
list($controller_name, $action_method) = $route->params['action'];
|
2015-05-22 12:36:26 -04:00
|
|
|
$params = (isset($route->params['params'])) ? $route->params['params'] : [];
|
2015-06-16 11:11:35 -04:00
|
|
|
|
|
|
|
if ( ! empty($route->tokens))
|
|
|
|
{
|
|
|
|
foreach($route->tokens as $key => $v)
|
|
|
|
{
|
|
|
|
if (array_key_exists($key, $route->params))
|
|
|
|
{
|
|
|
|
$params[$key] = $route->params[$key];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-05-22 12:36:26 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
$controller = new $controller_name();
|
|
|
|
|
|
|
|
// Run the appropriate controller method
|
2015-06-16 11:11:35 -04:00
|
|
|
$defaultHandler->addDataTable('controller_args', $params);
|
2015-05-22 12:36:26 -04:00
|
|
|
call_user_func_array([$controller, $action_method], $params);
|
|
|
|
}
|
|
|
|
|
2015-06-11 16:44:52 -04:00
|
|
|
/**
|
|
|
|
* Select controller based on the current url, and apply its relevent routes
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
2015-05-22 12:36:26 -04:00
|
|
|
private function _setup_routes()
|
|
|
|
{
|
2015-06-24 16:01:35 -04:00
|
|
|
$route_map = [
|
|
|
|
'anime' => 'AnimeController',
|
|
|
|
'manga' => 'MangaController',
|
|
|
|
];
|
2015-06-11 16:44:52 -04:00
|
|
|
$route_type = "anime";
|
2015-05-22 12:36:26 -04:00
|
|
|
|
2015-06-11 16:44:52 -04:00
|
|
|
if ($this->config->manga_host !== "" && strpos($_SERVER['HTTP_HOST'], $this->config->manga_host) !== FALSE)
|
|
|
|
{
|
|
|
|
$route_type = "manga";
|
|
|
|
}
|
|
|
|
else if ($this->config->manga_path !== "" && strpos($_SERVER['REQUEST_URI'], $this->config->manga_path) !== FALSE)
|
|
|
|
{
|
|
|
|
$route_type = "manga";
|
2015-05-27 09:03:42 -04:00
|
|
|
}
|
2015-05-22 12:36:26 -04:00
|
|
|
|
2015-06-11 16:44:52 -04:00
|
|
|
$routes = $this->config->routes;
|
2015-05-22 12:36:26 -04:00
|
|
|
|
2015-06-24 16:01:35 -04:00
|
|
|
// Add routes
|
|
|
|
foreach(['common', $route_type] as $key)
|
2015-05-22 12:36:26 -04:00
|
|
|
{
|
2015-06-24 16:01:35 -04:00
|
|
|
foreach($routes[$key] as $name => &$route)
|
2015-06-16 11:11:35 -04:00
|
|
|
{
|
2015-06-24 16:01:35 -04:00
|
|
|
$path = $route['path'];
|
|
|
|
unset($route['path']);
|
2015-06-16 11:11:35 -04:00
|
|
|
|
2015-06-24 16:01:35 -04:00
|
|
|
// Prepend the controller to the route parameters
|
|
|
|
array_unshift($route['action'], $route_map[$route_type]);
|
2015-06-17 08:50:01 -04:00
|
|
|
|
2015-06-24 16:01:35 -04:00
|
|
|
// Select the appropriate router method based on the http verb
|
|
|
|
$add = (array_key_exists('verb', $route)) ? "add" . ucfirst(strtolower($route['verb'])) : "addGet";
|
2015-06-17 08:50:01 -04:00
|
|
|
|
2015-06-24 16:01:35 -04:00
|
|
|
if ( ! array_key_exists('tokens', $route))
|
|
|
|
{
|
|
|
|
$this->router->$add($name, $path)->addValues($route);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$tokens = $route['tokens'];
|
|
|
|
unset($route['tokens']);
|
2015-06-17 08:50:01 -04:00
|
|
|
|
2015-06-24 16:01:35 -04:00
|
|
|
$this->router->$add($name, $path)
|
|
|
|
->addValues($route)
|
|
|
|
->addTokens($tokens);
|
|
|
|
}
|
2015-06-17 08:50:01 -04:00
|
|
|
}
|
|
|
|
}
|
2015-05-22 12:36:26 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
// End of Router.php
|