Routing - Logi-CE/fmup GitHub Wiki
Synopsis
Afin de mettre en place un systeme de module sur votre projet, il est necessaire de pouvoir analyser les requêtes HTTP et de déterminer par quel controlleur/action, la rêquete doit être traitée.
FMU offrait un système de base sur ce principe:
Partant de ce postulat, un composant de routing permet desormais de prendre en charge les types d'URL dans notre code et d'y appliquer le comportement désiré.
Le routing de base existe toujours au niveau de FMU. La couche d'abstraction du routing est ajoutée au niveau de FMUP.
Mise en place
Au niveau du bootstrap, nous declarons au framework que nous allons utiliser un systeme de routing
bootstrap
$framework = new FMUP\Framework();
$framework
->setRoutingSystem(new \LogiCE\Routing\Front())
->initialize();
Dans cet exemple, nous utilisons le systeme de routing spécifique au Front (LogiCE\Routing\Front
). Cette classe hérite du composant \FMUP\Routing
qui est attendu au niveau du framework.
Le Routing spécifique
Dans l'exemple précedant, le systeme de routing implémenté herité d'un systeme de routing commun qui lui meme est basé sur le composant Routing
de FMUP.
Le role du composant de routing est de gerer plusieurs regles de routing (appelées route) et de renvoyer la règle applicable.
Ainsi, il est possible de définir la liste des règles à appliquer lorsqu'une URL est appelée.
exemple du systeme de routing du front
namespace LogiCE\Routing;
use LogiCE\Routing\Route\Front as Route;
class Front extends Common
{
public function __construct()
{
$this->addRoute(new Route\Produit());
parent::__construct();
}
}
Dans le cas ci-dessus, nous ajoutons une règle de gestion pour les URL produits du front $this->addRoute(new LogiCE\Routing\Route\Front\Produit());
Les règles sont testées une à une dans l'ordre d'insertion des routes. La règle la plus haute est donc la regle qui sera appliquée en premier, si cette regle est applicable. Les routes ajoutées à la suite ne seront pas testées.
Lorsque cette règle sera applicable, le Framework
saura rediriger le code vers le bon controlleur et la bonne action.
La règle de route
Une règle de route doit obligatoirement hériter de la classe FMUP\Routing\Route
pour etre compatible avec le système de routing. Cette classe impose l'écriture de 3 methodes.
Ces methodes sont :
- canHandle
- getControllerName
- getAction
canHandle
permet de definir si la regle est applicable.
Si elle l'est, le comportement de la fonction handle
sera executé et le framework executera l'action retourné par getAction
du controlleur dont la classe est retourné par getControllerName
.
Un objet de requete est accessible dans les routes via la methode getRequest
permettant de faire des match sur les URLs.
Exemple de la règle de route produit du front
<?php
namespace LogiCE\Routing\Route\Front;
/**
* Class Produit - Route handling for product in front
* @package LogiCE\Routing\Route\Front
*/
class Produit extends \FMUP\Routing\Route
{
/**
* This route can only be applied in front module
*/
const MODULE = 'front';
/**
* Must return true if URI can be handled by route
* @return bool
*/
public function canHandle()
{
if (APPLICATION != self::MODULE) {
return false;
}
$result = preg_match('~/produit/(.+)~', $this->getRequest()->getRequestUri(), $matches);
return (bool) $result;
}
/**
* Must return action to call
* @return string
*/
public function getAction()
{
return 'index';
}
/**
* Must return Controller class name
* @return string
*/
public function getControllerName()
{
return 'CtrlProduit';
}
}
Si l'url appelée match selon le pattern /produit/(.+). (par exemle : http://demo-ce.castelis.com/produit/test). alors canHandle
renvoi true
et la regle est appliquée.
La methode index du controller CtrlProduit
sera appelée. (potentiellement, la methode getControllerName()
peut retourner la chaine \LogiCE\Module\Front\Controller\Produit
et le controlleur sera appelé en conséquence.