141 lines
4.3 KiB
PHP
141 lines
4.3 KiB
PHP
<?php
|
|
|
|
class Router extends Bus {
|
|
|
|
public $controller = null;
|
|
public $controllerName = null;
|
|
public $function = null;
|
|
private $route = array();
|
|
private $parameters = array();
|
|
private $path;
|
|
|
|
public function __construct(&$core) {
|
|
parent::__construct($core);
|
|
}
|
|
|
|
public function onLoad() {}
|
|
|
|
public function setPath($path) {
|
|
if (substr($path, -1, 1) == '/')
|
|
$path = substr($path, 0, strlen($path)-1);
|
|
|
|
return $this->path = $path;
|
|
}
|
|
|
|
public function getPath() {
|
|
return $this->path;
|
|
}
|
|
|
|
public function getRoute($index = null) {
|
|
if ($index === null)
|
|
return $this->route;
|
|
return $this->route[$index];
|
|
}
|
|
|
|
public function getParameters() {
|
|
return $this->parameters;
|
|
}
|
|
|
|
public function getParameter($index = 0) {
|
|
$parameters = $this->getParameters();
|
|
return ($index >= 0 ? $parameters[$index] : $parameters[count($parameters)+$index]);
|
|
}
|
|
|
|
/**
|
|
* Extracts the routing path to controller, function and parameters
|
|
*
|
|
* Path structure: /controller/function/par1/par2...
|
|
*/
|
|
public function route(){
|
|
// Retrieve the path and convert it to a proper format
|
|
$path = (!empty($this->getPath()) ? explode('/', preg_replace('#/+#','/',$this->getPath())) : array());
|
|
$path_size = count($path);
|
|
|
|
// If trailing slash was given or the last element was empty: remove it
|
|
if(end($path) == ''){
|
|
array_pop($path);
|
|
}
|
|
|
|
// Perform a routing check
|
|
// Prepare CONTROLLER, FUNCTION and PARAMS variables
|
|
$CONTROLLER = "";
|
|
$FUNCTION = "";
|
|
$PARAMS = array();
|
|
|
|
// First check if anything is given
|
|
if ($path_size >= 1) {
|
|
$CONTROLLER = $path[0];
|
|
if ($path_size >= 2) {
|
|
$FUNCTION = $path[1];
|
|
if ($path_size >= 3) {
|
|
$PARAMS = array_slice($path, 2);
|
|
}
|
|
}
|
|
} else {
|
|
// Default controller, default function, no arguments
|
|
$CONTROLLER = 'standard';
|
|
}
|
|
|
|
// Fire the event to notify our modules
|
|
$event = $this->events->fireEvent('routerRouteEvent', $CONTROLLER, $FUNCTION, $PARAMS);
|
|
|
|
// The event has been cancelled
|
|
if($event->isCancelled()){
|
|
return;
|
|
}
|
|
|
|
// Assign everything to the object to make it accessible, but let modules check it first
|
|
$this->route = $path;
|
|
$this->controllerName = ($event->controller === null || empty($event->controller) ? $this->config->main->default_controller : $event->controller);
|
|
$this->function = ($event->function === null || empty($event->function) ? $this->config->main->default_function : $event->function);
|
|
$this->parameters = $event->parameters;
|
|
$this->directory = ($event->directory === null || empty($event->directory) ? FUZEPATH . "/Application/Controller/" : $event->directory);
|
|
|
|
// Load the controller
|
|
$this->loadController();
|
|
}
|
|
|
|
/**
|
|
* Load a controller
|
|
* @access public
|
|
*/
|
|
public function loadController() {
|
|
$file = $this->directory . "controller.".strtolower($this->controllerName).".php";
|
|
$this->logger->log("Loading controller from file: '".$file."'");
|
|
|
|
if (file_exists($file)) {
|
|
if (!class_exists(ucfirst($this->controllerName)))
|
|
require_once($file);
|
|
|
|
$this->controllerClass = ucfirst($this->controllerName);
|
|
$this->controller = new $this->controllerClass($this->core);
|
|
|
|
if (method_exists($this->controller, $this->function) || method_exists($this->controller, '__call')) {
|
|
$this->controller->{$this->function}($this->parameters);
|
|
} elseif (method_exists($this->controller, 'not_found')) {
|
|
// Trying last resort
|
|
$this->logger->log("Function was not found, trying Controllers not_found function");
|
|
|
|
// Add the function to the parameters just because it's usefull
|
|
array_unshift($this->parameters, $this->function);
|
|
$this->controller->not_found($this->parameters);
|
|
} else {
|
|
$this->logger->logError("Could not load not_found function. Aborting");
|
|
// totally not found
|
|
}
|
|
} else {
|
|
$this->logger->logError("Could not find class. Reverting to default controller not_found");
|
|
$file = $this->directory . "controller.".strtolower($this->config->main->default_controller).".php";
|
|
if (file_exists($file))
|
|
require_once($file);
|
|
$this->controllerClass = ucfirst($this->config->main->default_controller);
|
|
$this->controller = new $this->controllerClass($this->core);
|
|
|
|
// Add the function to the parameters just because it's usefull
|
|
array_unshift($this->parameters, $this->function);
|
|
$this->controller->not_found($this->parameters);
|
|
}
|
|
}
|
|
}
|
|
|
|
?>
|