Minz: remove url_rewriting

As suggested
https://github.com/marienfressinaud/FreshRSS/issues/163#issuecomment-38478669

At the same time, removes a bunch of (almost) dead code such as
Minz_Router (the few remaining lines being moved to Minz_FrontController
to avoid a class)

Contributes to https://github.com/marienfressinaud/FreshRSS/issues/303
This commit is contained in:
Alexandre Alapetite
2014-03-24 20:55:18 +01:00
parent fd829d7567
commit c8aa451c76
8 changed files with 40 additions and 273 deletions

View File

@@ -8,16 +8,12 @@
* La classe ActionController représente le contrôleur de l'application
*/
class Minz_ActionController {
protected $router;
protected $view;
/**
* Constructeur
* @param $controller nom du controller
* @param $action nom de l'action à lancer
*/
public function __construct ($router) {
$this->router = $router;
public function __construct () {
$this->view = new Minz_View ();
$this->view->attributeParams ();
}

View File

@@ -30,7 +30,6 @@ class Minz_Configuration {
* définition des variables de configuration
* $salt une chaîne de caractères aléatoires (obligatoire)
* $environment gère le niveau d'affichage pour log et erreurs
* $use_url_rewriting indique si on utilise l'url_rewriting
* $base_url le chemin de base pour accéder à l'application
* $title le nom de l'application
* $language la langue par défaut de l'application
@@ -43,7 +42,6 @@ class Minz_Configuration {
private static $salt = '';
private static $environment = Minz_Configuration::PRODUCTION;
private static $base_url = '';
private static $use_url_rewriting = false;
private static $title = '';
private static $language = 'en';
private static $default_user = '';
@@ -90,9 +88,6 @@ class Minz_Configuration {
public static function baseUrl () {
return self::$base_url;
}
public static function useUrlRewriting () {
return self::$use_url_rewriting;
}
public static function title () {
return self::$title;
}
@@ -176,7 +171,6 @@ class Minz_Configuration {
$ini_array = array(
'general' => array(
'environment' => self::environment(true),
'use_url_rewriting' => self::$use_url_rewriting,
'salt' => self::$salt,
'base_url' => self::$base_url,
'title' => self::$title,
@@ -262,9 +256,6 @@ class Minz_Configuration {
if (isset ($general['base_url'])) {
self::$base_url = $general['base_url'];
}
if (isset ($general['use_url_rewriting'])) {
self::$use_url_rewriting = $general['use_url_rewriting'];
}
if (isset ($general['title'])) {
self::$title = $general['title'];

View File

@@ -16,26 +16,18 @@ class Minz_Dispatcher {
private static $instance = null;
private static $needsReset;
private $router;
private $controller;
/**
* Récupère l'instance du Dispatcher
*/
public static function getInstance ($router) {
public static function getInstance () {
if (self::$instance === null) {
self::$instance = new Minz_Dispatcher ($router);
self::$instance = new Minz_Dispatcher ();
}
return self::$instance;
}
/**
* Constructeur
*/
private function __construct ($router) {
$this->router = $router;
}
/**
* Lance le controller indiqué dans Request
* Remplit le body de Response à partir de la Vue
@@ -58,7 +50,7 @@ class Minz_Dispatcher {
$this->controller->lastAction ();
if (!self::$needsReset) {
echo $this->controller->view ()->build ();
$this->controller->view ()->build ();
}
} catch (Minz_Exception $e) {
throw $e;
@@ -90,7 +82,7 @@ class Minz_Dispatcher {
Minz_Exception::ERROR
);
}
$this->controller = new $controller_name ($this->router);
$this->controller = new $controller_name ();
if (! ($this->controller instanceof Minz_ActionController)) {
throw new Minz_ControllerNotActionControllerException (

View File

@@ -24,11 +24,10 @@
*/
class Minz_FrontController {
protected $dispatcher;
protected $router;
/**
* Constructeur
* Initialise le router et le dispatcher
* Initialise le dispatcher, met à jour la Request
*/
public function __construct () {
if (LOG_PATH === false) {
@@ -40,24 +39,46 @@ class Minz_FrontController {
Minz_Request::init ();
$this->router = new Minz_Router ();
$this->router->init ();
} catch (Minz_RouteNotFoundException $e) {
Minz_Log::record ($e->getMessage (), Minz_Log::ERROR);
Minz_Error::error (
404,
array ('error' => array ($e->getMessage ()))
$url = $this->buildUrl();
$url['params'] = array_merge (
$url['params'],
Minz_Request::fetchPOST ()
);
Minz_Request::forward ($url);
} catch (Minz_Exception $e) {
Minz_Log::record ($e->getMessage (), Minz_Log::ERROR);
$this->killApp ($e->getMessage ());
}
$this->dispatcher = Minz_Dispatcher::getInstance ($this->router);
$this->dispatcher = Minz_Dispatcher::getInstance();
}
/**
* Démarre l'application (lance le dispatcher et renvoie la réponse
* Retourne un tableau représentant l'url passée par la barre d'adresses
* @return tableau représentant l'url
*/
private function buildUrl() {
$url = array ();
$url['c'] = Minz_Request::fetchGET (
'c',
Minz_Request::defaultControllerName ()
);
$url['a'] = Minz_Request::fetchGET (
'a',
Minz_Request::defaultActionName ()
);
$url['params'] = Minz_Request::fetchGET ();
// post-traitement
unset ($url['params']['c']);
unset ($url['params']['a']);
return $url;
}
/**
* Démarre l'application (lance le dispatcher et renvoie la réponse)
*/
public function run () {
try {

View File

@@ -1,16 +0,0 @@
<?php
class Minz_RouteNotFoundException extends Minz_Exception {
private $route;
public function __construct ($route, $code = self::ERROR) {
$this->route = $route;
$message = 'Route `' . $route . '` not found';
parent::__construct ($message, $code);
}
public function route () {
return $this->route;
}
}

View File

@@ -1,209 +0,0 @@
<?php
/**
* MINZ - Copyright 2011 Marien Fressinaud
* Sous licence AGPL3 <http://www.gnu.org/licenses/>
*/
/**
* La classe Router gère le routage de l'application
* Les routes sont définies dans APP_PATH.'/configuration/routes.php'
*/
class Minz_Router {
const ROUTES_PATH_NAME = '/configuration/routes.php';
private $routes = array ();
/**
* Constructeur
* @exception FileNotExistException si ROUTES_PATH_NAME n'existe pas
* et que l'on utilise l'url rewriting
*/
public function __construct () {
if (Minz_Configuration::useUrlRewriting ()) {
if (file_exists (APP_PATH . self::ROUTES_PATH_NAME)) {
$routes = include (
APP_PATH . self::ROUTES_PATH_NAME
);
if (!is_array ($routes)) {
$routes = array ();
}
$this->routes = array_map (
array ('Url', 'checkUrl'),
$routes
);
} else {
throw new Minz_FileNotExistException (
self::ROUTES_PATH_NAME,
Minz_Exception::ERROR
);
}
}
}
/**
* Initialise le Router en déterminant le couple Controller / Action
* Mets à jour la Request
* @exception RouteNotFoundException si l'uri n'est pas présente dans
* > la table de routage
*/
public function init () {
$url = array ();
if (Minz_Configuration::useUrlRewriting ()) {
try {
$url = $this->buildWithRewriting ();
} catch (Minz_RouteNotFoundException $e) {
throw $e;
}
} else {
$url = $this->buildWithoutRewriting ();
}
$url['params'] = array_merge (
$url['params'],
Minz_Request::fetchPOST ()
);
Minz_Request::forward ($url);
}
/**
* Retourne un tableau représentant l'url passée par la barre d'adresses
* Ne se base PAS sur la table de routage
* @return tableau représentant l'url
*/
public function buildWithoutRewriting () {
$url = array ();
$url['c'] = Minz_Request::fetchGET (
'c',
Minz_Request::defaultControllerName ()
);
$url['a'] = Minz_Request::fetchGET (
'a',
Minz_Request::defaultActionName ()
);
$url['params'] = Minz_Request::fetchGET ();
// post-traitement
unset ($url['params']['c']);
unset ($url['params']['a']);
return $url;
}
/**
* Retourne un tableau représentant l'url passée par la barre d'adresses
* Se base sur la table de routage
* @return tableau représentant l'url
* @exception RouteNotFoundException si l'uri n'est pas présente dans
* > la table de routage
*/
public function buildWithRewriting () {
$url = array ();
$uri = Minz_Request::getURI ();
$find = false;
foreach ($this->routes as $route) {
$regex = '*^' . $route['route'] . '$*';
if (preg_match ($regex, $uri, $matches)) {
$url['c'] = $route['controller'];
$url['a'] = $route['action'];
$url['params'] = $this->getParams (
$route['params'],
$matches
);
$find = true;
break;
}
}
if (!$find && $uri != '/') {
throw new Minz_RouteNotFoundException (
$uri,
Minz_Exception::ERROR
);
}
// post-traitement
$url = Minz_Url::checkUrl ($url);
return $url;
}
/**
* Retourne l'uri d'une url en se basant sur la table de routage
* @param l'url sous forme de tableau
* @return l'uri formatée (string) selon une route trouvée
*/
public function printUriRewrited ($url) {
$route = $this->searchRoute ($url);
if ($route !== false) {
return $this->replaceParams ($route, $url['params']);
}
return '';
}
/**
* Recherche la route correspondante à une url
* @param l'url sous forme de tableau
* @return la route telle que spécifiée dans la table de routage,
* false si pas trouvée
*/
public function searchRoute ($url) {
foreach ($this->routes as $route) {
if ($route['controller'] == $url['c']
&& $route['action'] == $url['a']) {
// calcule la différence des tableaux de params
$params = array_flip ($route['params']);
$difference_params = array_diff_key (
$params,
$url['params']
);
// vérifie que pas de différence
// et le cas où $params est vide et pas $url['params']
if (empty ($difference_params)
&& (!empty ($params) || empty ($url['params']))) {
return $route;
}
}
}
return false;
}
/**
* Récupère un tableau dont
* - les clés sont définies dans $params_route
* - les valeurs sont situées dans $matches
* Le tableau $matches est décalé de +1 par rapport à $params_route
*/
private function getParams($params_route, $matches) {
$params = array ();
for ($i = 0; $i < count ($params_route); $i++) {
$param = $params_route[$i];
$params[$param] = $matches[$i + 1];
}
return $params;
}
/**
* Remplace les éléments de la route par les valeurs contenues dans $params
*/
private function replaceParams ($route, $params_replace) {
$uri = $route['route'];
$params = array();
foreach($route['params'] as $param) {
$uri = preg_replace('#\((.+)\)#U', $params_replace[$param], $uri, 1);
}
return stripslashes($uri);
}
}

View File

@@ -5,8 +5,7 @@
*/
class Minz_Url {
/**
* Affiche une Url formatée selon que l'on utilise l'url_rewriting ou non
* si oui, on cherche dans la table de routage la correspondance pour formater
* Affiche une Url formatée
* @param $url l'url à formater définie comme un tableau :
* $url['c'] = controller
* $url['a'] = action
@@ -39,13 +38,7 @@ class Minz_Url {
}
if ($isArray) {
$router = new Minz_Router ();
if (Minz_Configuration::useUrlRewriting ()) {
$url_string .= $router->printUriRewrited ($url);
} else {
$url_string .= self::printUri ($url, $encodage);
}
$url_string .= self::printUri ($url, $encodage);
} else {
$url_string .= $url;
}
@@ -54,7 +47,7 @@ class Minz_Url {
}
/**
* Construit l'URI d'une URL sans url rewriting
* Construit l'URI d'une URL
* @param l'url sous forme de tableau
* @param $encodage pour indiquer comment encoder les & (& ou &amp; pour html)
* @return l'uri sous la forme ?key=value&key2=value2

View File

@@ -228,7 +228,6 @@ function saveStep3 () {
$ini_array = array(
'general' => array(
'environment' => empty($_SESSION['environment']) ? 'production' : $_SESSION['environment'],
'use_url_rewriting' => false,
'salt' => $_SESSION['salt'],
'base_url' => '',
'title' => $_SESSION['title'],