Files
thetool/lib/mvcfronk/mfRouter/mfRouter.php
2022-08-25 16:59:54 +02:00

157 lines
4.2 KiB
PHP

<?php
require_once(LIBDIR."/autoloader/autoloader.php");
require_once(LIBDIR."/mvcfronk/mfLog/mfLoghandler.php");
/**
* This class routes incoming requests.
* It should be called by the entry script (public/index.php or CLI.php) as the entrypoint into the application.
* Looks at mod and action parameters and loads the corresponding class.
* If no parameters are given, uses default route.
* Also loads Configfile.
*
* @author fronk
* @param array of request params $request
*/
class mfRouter {
private $default=array();
private $mod;
private $action;
public function __construct($request) {
//var_dump($request);exit;
// set default route, in case no default route is defined in configfile.
$this->default['mod']="Application";
$this->default['action']="Index";
if(!defined('MFUSEFANCYURLS')) {
define('MFUSEFANCYURLS',false);
}
if(defined("DEFAULT_ROUTE") && strlen(DEFAULT_ROUTE)) {
$defroute = explode("_",DEFAULT_ROUTE);
$this->default['mod'] = $defroute[0];
if(count($defroute) > 1 && $defroute[1]) {
$this->default['action'] = $defroute[1];
}
}
// set parameters supplied in url
$umod = "";
$uaction = "";
// get mod and action
$m = [];
if(array_key_exists("action", $request) && preg_match('/^([^_]+)(?:_(.+)?)?$/',$request['action'],$m)) {
$umod = $m[1];
$this->mod = $m[1];
$this->action = "Index";
if(count($m) > 2 && $m[2]) {
$uaction = $m[2];
$this->action = $m[2];
}
} else {
$this->mod = $this->default['mod'];
$this->action = $this->default['action'];
}
// if login request, redirect to mfLoginController
if(array_key_exists("mfLogin_action", $request) && $request['mfLogin_action'] == "mfLogin_Login") {
$this->mod = "mfLogin";
$this->action = "Login";
$classname = "mfLoginController";
} else {
// set classname of controller to load
$classname = $this->mod."Controller";
}
// get baseurl from fancy urls if used
if(MFUSEFANCYURLS) {
if(!$umod) {
$baseurl = $_SERVER['REQUEST_URI'];
}
if($umod && !$uaction) {
if(preg_match("#^(.+)/$umod/?\\??#i",$_SERVER['REQUEST_URI'],$m)) {
$baseurl = $m[1];
}
}
if($umod && $uaction) {
if(preg_match("#^(.+)/$umod/$uaction/?\\??#i",$_SERVER['REQUEST_URI'],$m)) {
$baseurl = $m[1];
}
}
define("MFFANCYBASEURL",$baseurl);
}
// api call handling
if(ucfirst($this->mod) == "Api") {
//var_dump($request);exit;
$apiversion = API_VERSION;
$apicall = false;
$apimod = "";
$apiaction = "";
if($request["apiv"]) {
$apiversion = $request["apiv"];
}
if(!defined("CURRENT_API_VERSION")) {
define("CURRENT_API_VERSION", $apiversion);
}
if($request['apicall']) {
$apicall = $request['apicall'];
$m = [];
if(preg_match('/^([^_]+)(?:_(.+)?)?$/',$apicall,$m)) {
$apimod = $m[1];
$apiaction = "Call";
if(array_key_exists(2, $m) && $m[2]) {
$apiaction = $m[2];
}
}
$this->mod = ucfirst($apimod);
$this->action = $apiaction;
// set classname to apropriate Api Controller
$classname = $this->mod."Apicontroller";
}
} else {
// session only for non-api requests
if(defined("MFSESSION") && MFSESSION === true) {
session_name(MFAPPNAME."_session");
session_start();
}
}
$request['mod'] = ucfirst($this->mod);
$request['action'] = ucfirst($this->action);
$request['http_method'] = $_SERVER['REQUEST_METHOD'];
define('MFROUTER_MOD',$this->mod);
define('MFROUTER_ACTION',$this->action);
// initiate layout instance
$Layout = Layout::singleton();
$Layout->setTemplate($this->mod."/".$this->action);
$Layout->set("Mod",$this->mod);
$Layout->set("Action",$this->action);
// load the appropriate Controller
try {
$page = new $classname($request);
} catch(Exception $e) {
require_once(LIBDIR."/mvcfronk/mfExceptionhandler/mfExceptionhandlerController.php");
$exhc = new mfExceptionhandlerController($e);
}
$Layout->display();
}
}