2014-07-23 15:52:50 +02:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* MINZ - Copyright 2011 Marien Fressinaud
|
|
|
|
* Sous licence AGPL3 <http://www.gnu.org/licenses/>
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Le Dispatcher s'occupe d'initialiser le Controller et d'executer l'action
|
|
|
|
* déterminée dans la Request
|
|
|
|
* C'est un singleton
|
|
|
|
*/
|
|
|
|
class Minz_Dispatcher {
|
|
|
|
const CONTROLLERS_PATH_NAME = '/Controllers';
|
|
|
|
|
|
|
|
/* singleton */
|
|
|
|
private static $instance = null;
|
|
|
|
private static $needsReset;
|
2015-02-08 18:55:48 +01:00
|
|
|
private static $registrations = array();
|
2014-07-23 15:52:50 +02:00
|
|
|
|
|
|
|
private $controller;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Récupère l'instance du Dispatcher
|
|
|
|
*/
|
|
|
|
public static function getInstance () {
|
|
|
|
if (self::$instance === null) {
|
|
|
|
self::$instance = new Minz_Dispatcher ();
|
|
|
|
}
|
|
|
|
return self::$instance;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Lance le controller indiqué dans Request
|
|
|
|
* Remplit le body de Response à partir de la Vue
|
|
|
|
* @exception Minz_Exception
|
|
|
|
*/
|
|
|
|
public function run () {
|
|
|
|
do {
|
|
|
|
self::$needsReset = false;
|
|
|
|
|
|
|
|
try {
|
2015-02-08 18:55:48 +01:00
|
|
|
$this->createController (Minz_Request::controllerName ());
|
2014-07-23 15:52:50 +02:00
|
|
|
$this->controller->init ();
|
|
|
|
$this->controller->firstAction ();
|
|
|
|
if (!self::$needsReset) {
|
|
|
|
$this->launchAction (
|
|
|
|
Minz_Request::actionName ()
|
|
|
|
. 'Action'
|
|
|
|
);
|
|
|
|
}
|
|
|
|
$this->controller->lastAction ();
|
|
|
|
|
|
|
|
if (!self::$needsReset) {
|
|
|
|
$this->controller->view ()->build ();
|
|
|
|
}
|
|
|
|
} catch (Minz_Exception $e) {
|
|
|
|
throw $e;
|
|
|
|
}
|
|
|
|
} while (self::$needsReset);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Informe le contrôleur qu'il doit recommancer car la requête a été modifiée
|
|
|
|
*/
|
|
|
|
public static function reset() {
|
|
|
|
self::$needsReset = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Instancie le Controller
|
2015-02-08 18:55:48 +01:00
|
|
|
* @param $base_name le nom du controller à instancier
|
2014-07-23 15:52:50 +02:00
|
|
|
* @exception ControllerNotExistException le controller n'existe pas
|
|
|
|
* @exception ControllerNotActionControllerException controller n'est
|
|
|
|
* > pas une instance de ActionController
|
|
|
|
*/
|
2015-02-08 18:55:48 +01:00
|
|
|
private function createController ($base_name) {
|
|
|
|
if (self::isRegistered($base_name)) {
|
|
|
|
self::loadController($base_name);
|
|
|
|
$controller_name = 'FreshExtension_' . $base_name . '_Controller';
|
|
|
|
} else {
|
|
|
|
$controller_name = 'FreshRSS_' . $base_name . '_Controller';
|
|
|
|
}
|
2014-07-23 15:52:50 +02:00
|
|
|
|
|
|
|
if (!class_exists ($controller_name)) {
|
|
|
|
throw new Minz_ControllerNotExistException (
|
|
|
|
$controller_name,
|
|
|
|
Minz_Exception::ERROR
|
|
|
|
);
|
|
|
|
}
|
|
|
|
$this->controller = new $controller_name ();
|
|
|
|
|
|
|
|
if (! ($this->controller instanceof Minz_ActionController)) {
|
|
|
|
throw new Minz_ControllerNotActionControllerException (
|
|
|
|
$controller_name,
|
|
|
|
Minz_Exception::ERROR
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Lance l'action sur le controller du dispatcher
|
|
|
|
* @param $action_name le nom de l'action
|
|
|
|
* @exception ActionException si on ne peut pas exécuter l'action sur
|
|
|
|
* le controller
|
|
|
|
*/
|
|
|
|
private function launchAction ($action_name) {
|
|
|
|
if (!is_callable (array (
|
|
|
|
$this->controller,
|
|
|
|
$action_name
|
|
|
|
))) {
|
|
|
|
throw new Minz_ActionException (
|
|
|
|
get_class ($this->controller),
|
|
|
|
$action_name,
|
|
|
|
Minz_Exception::ERROR
|
|
|
|
);
|
|
|
|
}
|
|
|
|
call_user_func (array (
|
|
|
|
$this->controller,
|
|
|
|
$action_name
|
|
|
|
));
|
|
|
|
}
|
2015-02-08 18:55:48 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Register a controller file.
|
|
|
|
*
|
|
|
|
* @param $base_name the base name of the controller (i.e. ./?c=<base_name>)
|
|
|
|
* @param $base_path the base path where we should look into to find info.
|
|
|
|
*/
|
|
|
|
public static function registerController($base_name, $base_path) {
|
|
|
|
if (!self::isRegistered($base_name)) {
|
|
|
|
self::$registrations[$base_name] = $base_path;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return if a controller is registered.
|
|
|
|
*
|
|
|
|
* @param $base_name the base name of the controller.
|
|
|
|
* @return true if the controller has been registered, false else.
|
|
|
|
*/
|
|
|
|
public static function isRegistered($base_name) {
|
|
|
|
return isset(self::$registrations[$base_name]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Load a controller file (include).
|
|
|
|
*
|
|
|
|
* @param $base_name the base name of the controller.
|
|
|
|
*/
|
|
|
|
private static function loadController($base_name) {
|
|
|
|
$base_path = self::$registrations[$base_name];
|
|
|
|
$controller_filename = $base_path . '/controllers/' . $base_name . 'Controller.php';
|
|
|
|
include_once $controller_filename;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static function setViewPath($controller, $base_name) {
|
|
|
|
$base_path = self::$registrations[$base_name];
|
|
|
|
$controller->view()->setBasePathname($base_path);
|
|
|
|
}
|
2014-07-23 15:52:50 +02:00
|
|
|
}
|