public function __construct() { $app = App::getInstance(); // On initialise l'objet Request if ($_ENV['USE_ROUTES']) { require '../Config/routes.php'; $this->request = Router::run(new Request($app)); } else { $this->request = new Request($app); } // On parse l'url (définition du controller, action,...) Router::parse($this->request); // On affiche les erreurs ? Debug::set(); // On charge le bon controller try { $controller = $this->loadController(); } catch (SwithException $e) { (new SwithError(['message' => "Le controller {$this->request->controller} est introuvable", "title" => "Controlleur introuvable"]))->display(); } if (method_exists($controller, "beforeRender")) { $controller->beforeRender(); } // On appelle la fonction $action = $this->request->getAction(); $availablesActions = array_diff(get_class_methods($controller), get_class_methods(get_parent_class($controller))); if (in_array($action, $availablesActions)) { call_user_func_array([$controller, $action], $this->request->params); } else { (new SwithError(['message' => "Le controller {$this->request->controller} n'a pas de methode {$action}", "title" => "Methode introuvable"]))->display(); } $controller->render($controller->view); }
/** * Permet de parser l'url (définir quel est le controller, quelle est l'action) * @param Request $request objet Request */ public static function parse(Request $request) { if (!$request->isRooted) { // On définit les prefixes s'il y en a Router::setPrefixes(); // On enlève les / en début et fin d'url $url = trim($request->url, '/'); // On créer un tableau à partir de l'URL $params = explode('/', $url); // On vérifie si on a un prefixe ou pas if (isset($params[0]) && in_array($params[0], self::$prefixes)) { // Si oui on le stock dans la request $request->prefixe = $params[0]; // et on l'enlève du tableau URL array_shift($params); } // On déinit ensuite le controlleur $request->controller = !empty($params[0]) ? $params[0] : App::getInstance()->getAppSettings("default_controller"); // On vérifie si y a pas une tentative de hack avec "l'ancien system" en vérifiant qu'on appelle pas controller/prefixe_action if (isset($params[1])) { $action = $params[1]; // On check si l'action n'est pas au format prefixe_action foreach (Self::$prefixes as $k) { if (strpos($action, $k . '_') === 0) { // Si c'est le cas on définit le prefixe et on reformat l'action $request->prefixe = $k; $action = str_replace($k . '_', '', $action); } } $request->action = $action; } else { $request->action = App::getInstance()->getAppSettings("default_action"); } $request->params = array_slice($params, 2); } }