< – Inhaltsverzeichnis – >
FW_Front_Controller: er liest aus dem Request ab welche Kontroller und Aktionen ausgeführt werden sollen, mit welchen Parametern. Er läd diese und übergibt Ihnen den Request und den Response. Er führt Pre- & Postfilter aus und schickt das Response zum Browser.
/** (c) 2010 Arne "w13531" Wenzel [ mailto: w13531 (at) terrorhippiecrew (dot) net ] **/
class FW_Front_Controller extends FW_Object {
private static $instance = null;
private $preFilters = null;
private $postFilters = null;
private $controller_path = null;
/**
* private clone
**/
private function __clone() {}
/**
* private constructor
**/
private function __construct() {
$this->preFilters = FW_Workbench::ClassLoader('FW_Filter_Chain');
$this->postFilters = FW_Workbench::ClassLoader('FW_Filter_Chain');
}
/**
* singleton
**/
public static function getInstance() {
if(self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
/**
* set the path to application controllers
**/
public function setControllerPath($cntrl_path = null) {
if($cntrl_path == null) {
$this->controller_path = DR . 'application' . DS;
} else {
$this->controller_path = $cntrl_path;
}
}
/**
* class loader factory
**/
public function ClassLoader($ClassName, $params = null) {
if(!is_string($ClassName) || !trim($ClassName)) {
$this->log(date('H:i:s', time()) . "\t" . __CLASS__ . ':' . __FUNCTION__ . '() tried to load illegal class: ' . $ClassName);
return false;
}
$class_path = $this->controller_path . $ClassName . '.class.php';
if(file_exists($class_path)) {
require_once($class_path);
} else {
$this->log(date('H:i:s', time()) . "\t" . __CLASS__ . ':' . __FUNCTION__ . '() File not found: ' . $class_path);
return false;
}
if(class_exists($ClassName)) {
try {
$obj = new $ClassName($params);
} catch(Exception $e) {
$this->log(date('H:i:s', time()) . "\t" . __CLASS__ . ':' . __FUNCTION__ . '() could not create class: ' . $e->getMessage());
return false;
}
} else {
$this->log(date('H:i:s', time()) . "\t" . __CLASS__ . ':' . __FUNCTION__ . '() class not found: ' . $ClassName);
return false;
}
$this->log(date('H:i:s', time()) . "\t" . __CLASS__ . ':' . __FUNCTION__ . '() invoked successfully class: ' . $ClassName);
return $obj;
}
/**
* URL Router
**/
public function route(FW_HTTP_Request $request, FW_HTTP_Response $response) {
if($request->issetGet('url') && $request->getGet('url') != '') {
$url = explode('/',$request->getGet('url'));
if(isset($url[0]) && $url[0] != '') {
$module = htmlentities(array_shift($url));
} else {
$module = 'index';
}
if(isset($url[0]) && $url[0] != '') {
$action = htmlentities(array_shift($url));
} else {
$action = 'index';
}
if(is_array($url)) {
$params = $url;
} else {
$params = null;
}
} else {
$module = 'index';
$action = 'index';
$params = null;
}
$request->setControllerName($module);
$request->setActionName($action);
$request->setActionParams($params);
}
/**
* add a pre-filter
**/
public function addPreFilter(FW_Filter_Interface $filter) {
$this->preFilters->addFilter($filter);
}
/**
* add a post-filter
**/
public function addPostFilter(FW_Filter_Interface $filter) {
$this->postFilters->addFilter($filter);
}
/**
* runs a user defined controller
* via URL Request
* and outputs the Response
* excecutes PRE and POST filters
* TODO: implement ACL for fully CMS
**/
public function run(FW_Http_Request $request, FW_Http_Response $response) {
$this->preFilters->execute($request, $response);
$module = ucwords($request->getControllerName()) . '_Controller';
$action = $request->getActionName() . '_action';
$params = $request->getActionParams();
$controller = $this->ClassLoader($module, array($request, $response));
if($controller && $controller instanceof FW_Controller) {
if(is_callable(array($controller, $action))) {
$controller->$action($params);
} else if(is_callable(array($controller, 'index_action'))) { //default action instead?
array_unshift($params, $request->getActionName()); //for consistency
$request->setActionName('index'); //for consistency
$controller->index_action($params);
} else {
$response->redirect($request, $response, 'error', 'error_404', $params);
$this->log(date('H:i:s',time()) . "\t" . __CLASS__ . ':' . __FUNCTION__ . '() tried to excecute invalid Action Method: '. $module . '->' . $action . '()');
}
} else {
$this->log(date('H:i:s',time()) . "\t" . __CLASS__ . ':' . __FUNCTION__ . '() tried to excecute invalid Controller: '. $module . '->' . $action . '()');
$response->redirect($request, $response, 'error', 'error_404', $params);
}
$this->postFilters->execute($request, $response);
$response->send();
}
}