rewriting personnalisé

71 views
Skip to first unread message

synbios

unread,
Mar 7, 2012, 9:34:39 AM3/7/12
to finemedia-oss
Quelle est la bonne méthode pour gérer efficacement son propre
rewriting en contournant le framework ?

Ce que j'ai fait :
- 2 règles htaccess de test :
RewriteRule ^([a-z]+)/([a-z]+).html$ index.php?cat=$1&page=$2
[QSA,L]
RewriteRule ^([a-z]+).html$ index.php?page=$1 [QSA,L]

- un ProxyController avec la méthode magique _call() suivante :
public function __call($name, $arguments){
if(isset($_GET['page']) && $_GET['page'] == 'home'){
$this->subProcess('HomeController', 'index');
$this->template('home/index.tpl');
}
}

Ya-t-il a une méthode plus indiquée pour arriver à ce résultat ?

amaury

unread,
Mar 7, 2012, 10:31:05 AM3/7/12
to finemedia-oss
Mmh, on peut effectivement imaginer de faire les choses de cette
manière.
Mais, de manière générale, il est plus simple de créer un service en
suivant la philosophie de Temma, plutôt que de vouloir plier l'outil à
un usage différent.

Prenons le cas d'une URL "/aaa/bbb.html", que tu réécris en "index.php?
cat=aaa&page=bbb".
Le plus simple serait de passer par des URLs du type "/article/aaa/
bbb", et d'utiliser un ArticleController.

Si vraiment tu ne veux pas mettre le nom du contrôleur dans l'URL, tu
pourrais avoir des URLs du genre "/aaa/bbb", et utiliser un
DefaultController qui prenne en charge toutes les requêtes qui n'ont
pas déjà un contrôleur dédié (c'est ce qu'on fait sur les sites
ComprendreChoisir.com).

En tout cas, passer par des paramètres GET, pour ensuite refaire tout
le routage à la main, c'est possible mais ce n'est pas vraiment
recommandé.

silvio barahona

unread,
Mar 7, 2012, 10:46:08 AM3/7/12
to fineme...@googlegroups.com
Merci pour la réponse rapide.
Je ne suis pas bien sûr du coup de la façon de prendre en charge la resquête dans le DefaultController.
A quoi ressemblerait-il exactement ?


--
You received this message because you are subscribed to the Google Groups "finemedia-oss" group.
To post to this group, send email to fineme...@googlegroups.com.
To unsubscribe from this group, send email to finemedia-os...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/finemedia-oss?hl=en.


Hervé Thouzard

unread,
Mar 7, 2012, 10:46:52 AM3/7/12
to fineme...@googlegroups.com
Bonjour,

Je me permets d'intervenir même si je ne suis pas "concerné".
Dans un autre framework (TinyMVC) dans la partie déclarative des paramètres on peut faire ce genre de chose :

/* URL routing, use preg_replace() compatible syntax */
$config['routing']['search'] =  array(
'!^/actualite/(\d+)!', // La page de détail d'un article avec son numéro d'article
'!^/actualite/page/(\d+)!', // La page d'index des actualités avec un numéro de page
'!^/partenaires/(\d+)!', // Tout le reste est identique
'!^/partenaires/page/(\d+)!',
'!^/telechargements/(\d+)!',
'!^/telechargements/page/(\d+)!',
'!^/contenu/(\d+)!',
'!^/contenu/page/(\d+)!',
'!^/contenu/bloc/(\d+)!',
'!^/agenda/(\d+)!',
'!^/photos/page/(\d+)!', // La page d'index des actualités avec un numéro de page
);
// Vers quoi on le redirige (1 ligne de ci-dessus = 1 ligne de ci-dessous)
$config['routing']['replace'] = array(
'/actualite/detail/id/${1}',
'/actualite/index/id/${1}',
'/partenaires/detail/id/${1}',
'/partenaires/index/id/${1}',
'/telechargements/detail/id/${1}',
'/telechargements/index/id/${1}',
'/contenu/detail/id/${1}',
'/contenu/index/id/${1}',
'/contenu/bloc/id/${1}',
'/agenda/detail/id/${1}',
'/photos/index/id/${1}',
);

Cela nous permet, par exemple, de faire http://www.example.org/actualite/15/titre.html
au lieu de :

Peut importe l'implantation, l'important c'est le principe.

Cordialement,
Hervé


Le 7 mars 2012 16:31, amaury <amaury....@gmail.com> a écrit :

amaury

unread,
Mar 7, 2012, 12:19:48 PM3/7/12
to finemedia-oss
L'idée est d'écrire un contrôleur qui sera défini comme étant le
DefaultController dans le fichier "etc/temma.json".
Ce contrôleur doit posséder une action proxy, c'est-à-dire une méthode
execProxy(), qui sera systématiquement appelée.

Dans ton exemple, tes URLs pouvaient posséder un ou deux éléments.
Appelons la premier élément "category" et le second "page".
Il va falloir que la méthode utilise l'objet TemmaRequest pour
récupérer les informations sur la requête. Il faut récupérer le nom du
contrôleur et le nom de l'action, qui correspondent aux deux premiers
éléments de l'URL.

class MonControleurParDefaut extends \Temma\Controller {
public function execProxy() {
// on récupère la catégorie et la page demandées
$category = $this->_request->getController();
$page = $this->_request->getAction();
// on récupère les informations de la base de données
$pageData = ...
// on passe les données au template
$this->set('page', $pageData);
// on indique le template à utiliser
if ($category == 'pouet')
$this->template('pouet/index.tpl');
else
$this->template('default/index.tpl');
}
}



Sinon, une autre possibilité : avoir des URLs du type "/article/aaa/
bbb" :

class ArticleController extends \Temma\Controller {
public function __call($name, $args) {
$category = $name;
$page = $args[0];
// ...
}
}


Dernière possibilité : si tu connais par avance tous les noms de
catégories, tu peux créer des routes dans le fichier de configuration
temma.json, qui redirigent toutes vers le même contrôleur.


On Mar 7, 4:46 pm, silvio barahona <synbi...@gmail.com> wrote:
> Merci pour la réponse rapide.
> Je ne suis pas bien sûr du coup de la façon de prendre en charge la
> resquête dans le DefaultController.
> A quoi ressemblerait-il exactement ?
>

amaury

unread,
Mar 7, 2012, 12:27:46 PM3/7/12
to finemedia-oss
Concernant l'exemple d'Hervé, la philosophie de Temma est justement
d'éviter ce genre de choses, et de privilégier la simplicité.

Avoir un URL du type "/article/voir/12" ne gêne pas la plupart du
temps.
Si on veut à tout prix avoir des URLs "/article/12", il suffit
d'utiliser l'action proxy (execProxy) ou l'action par défaut (__call).

Si on veut à tout prix gérer ça par une configuration, et non pas dans
le code des contrôleurs, il faut activer un plugin de réécriture.
C'est tout à fait possible, et c'est fidèle à l'esprit du framework :
proposer un fonctionnement simple, qu'on peut étendre à l'aide de
plugins, et non pas un truc complexe à la base.


Personnellement, je préfère garder des URLs de la forme "/objet/
méthode/param1/param2", ne serait-ce que pour retrouver instantanément
le code qui répond à une URL donnée, sans avoir besoin d'ouvrir des
fichiers de configuration. Mais ce n'est qu'un avis personnel.
> Cela nous permet, par exemple, de fairehttp://www.example.org/actualite/15/titre.html
> au lieu de :http://www.example.org/actualite/detail/15/titre.html
>
> Peut importe l'implantation, l'important c'est le principe.
>
> Cordialement,
> Hervé
>

synbios

unread,
Mar 7, 2012, 3:04:03 PM3/7/12
to finemedia-oss
Effectivement, j'ai opté pour un preplugin et ça fait très bien
l'affaire.

Merci !
Reply all
Reply to author
Forward
0 new messages