En gros, dans le code, ça donne ce que j'appelle un PA (abbrévation de Page/Action), les urls se présentent sous la forme http://example.com/entrypoint/Page/action/args/foo/bar. L'entrypoint sert principalement à déterminer le type de vue à executer au final.

Le point qui nous interresse présentement est la gestion des PA. En gros, je me demande si, au lieu d'avoir une arborescence type GRUMF_ROOT/pages/Page.php, il ne serait pas plus judicieux d'avoir GRUMF_ROOT/pages/Page/action.php.

Cette méthode aurait plus de sens dans le contexte d'un retour aux sources du protocole HTTP et d'une API qui se rapprocherait de REST. Je m'explique. HTTP dispose de plusieurs actions, dont les plus connues sont GET et POST (il existe également par exemple DELETE et HEAD). Dans le cadre de ce que j'appellerai une API REST, chaque page serait controllé par les actions HTTP.

Exemple: disons qu'on a une page Recettes qui gère une liste de recettes. On aura un controlleur Recipes qui supportera les actions HTTP suivantes:

  • GET: affichage d'une ou plusieurs recettes
  • POST: modification d'une recette
  • DELETE: suppression d'une ou plusieurs recettes
  • HEAD: bah heu... liste des recettes ? (EDIT: au temps pour moi, je devais être fatigué hier, mais HEAD n'est censé renvoyer que des headers HTTP)

Suis-je clair ? Revenons au sujet initial. Avoir une classe par Action plutot que par Page autorise une implémentation du genre:

<?php
 
class Recipes {
 
	function POST($id = null, $name, $body) {
	
		// if $id is not null, UPDATE the requested recipe
		// else create a new recipe
	
	}
	
	function GET($id = null) {
	
		// if $id is not null, retrieve the requested recipe
		// else retrieve the recipes list
	
	}
	
	function DELETE($id) {
	
		// delete the requested recipe
	
	}
	
	function _helperMethod() {
	
		// do stuff here
		// a kind of early namespace implementation :p
	
	}
 
}
 
?>

Alors qu'avec une Page == une classe, on reste scotché au classique:

<?php
 
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
 
	// do stuff
 
}
 
?>

(oui mon deuxième exemple est beaucoup plus succint que le premier désolé).

Bon, ce billet commence a se faire un peu plus long que je n'avais pensé au début, surtout que je commence a entrevoir un début de solution, mais ce que j'aimerai surtout, c'est votre avis sur la question (a part le fait qu'aucun navigateur n'envoit de requête HTTP DELETE :D), donc n'hésitez pas :-)