2012-03-10 4 views
1

J'essaye de créer des liens courts vers mon application dans le codeigniter mais j'ai rencontré un genre de problème en concevant mon itinéraire. Le problème est que je veux une route qui prendra une chaîne contenant a-Z et numéros et redirige cela vers un contrôleur appelé image avec la chaîne après. Comme ceci: app.com/randomstring -> app.com/image/randomstring. Mais lorsque j'essaie de le faire dans le fichier de configuration de routes avec une expression régulière, cela désactive mon application et je n'arrive pas à entrer des URL "normales" avec des contrôleurs qui existent déjà.Acheminer des chaînes aléatoires vers un contrôleur spécifique dans CodeIgniter?

Comment ma route ressemble en ce moment (je sais que c'est probablement très mal fait):

$route['(^[A-Za-z0-9]+$)'] = "image/$1"; 

est-il un moyen facile de rediriger avec cette url courte sans utiliser un autre contrôleur faux premier comme ceci: app.com/i/randomstring -> app.com/image/randomstring

Et pourriez-vous m'aider à m'améliorer et à me dire quelle partie de mon expression rationnelle échoue?

+0

À noter que j'ai une réécriture d'URL dans .htaccess pour supprimer index.php de n'importe quelle page. – Ms01

+0

Les chaînes sont-elles vraiment aléatoires? Si c'est le cas, il est possible (bien que peu probable) qu'ils puissent entrer en conflit avec un nom de contrôleur valide. À quoi ressemblent exactement les URL de l'image? comment les créez-vous? Sont-ils garantis d'avoir au moins un nombre, des limites de longueur, des cas mixtes, etc.? –

+0

Eh bien, je vais m'assurer que la chaîne ne soit pas en conflit avec un nom de contrôleur. Je les crée avec une fonction qui prend un nombre et juste le convertir en une chaîne. En ce moment, j'utilise la fonction de ce type pour le faire, mais cela pourrait changer dans le futur. http://kevin.vanzonneveld.net/techblog/article/create_short_ids_with_php_like_youtube_or_tinyurl/ – Ms01

Répondre

1

Comme je l'ai mentionné dans les commentaires, sans une spécification clairement définie sur ce que seront les URL de l'image, il n'y a pas de moyen global de résoudre ce problème. Même YouTube (lié au library you linked to) utilise des URL comme /watch?v=h8skj3, où "watch" est le déclencheur.

L'utilisation d'un i/r4nd0m$tring ferait ce pas un problème, et il est ce que je propose, mais j'eu une autre idée:

$route['(:any)'] = "image/$1"; 

// Re-Route all valid controllers 
foreach (array('users', 'login', 'blog', 'signup') as $controller) 
{ 
    $route[$controller] = $controller; 
    $route[$controller.'/(:any)'] = $controller.'/$1'; 
} 
unset($controller); 

Vous pourriez avoir besoin de la route de dernière image, je ne suis pas sûr à 100%. Cela doit acheminer tout à image/sauf les les contrôleurs que vous définissez. Vous pouvez même utiliser glob() ou quelque chose pour analyser votre répertoire de contrôleur pour les fichiers PHP pour remplir le tableau.

Une autre façon d'obtenir un caractère plus court que i/string pourrait être d'utiliser un déclencheur de caractère, comme example.com/*randomstring, mais c'est un peu idiot, i/ est beaucoup plus propre et évidemment, plus facile à déployer.

+0

Merci c'est une solution parfaite pour mon application. Je vais probablement le déployer lorsque tous les contrôleurs sont écrits et prêts, donc je ne ferai aucune erreur de faire disparaître le tableau. – Ms01

+0

Je me suis juste rappelé que je pouvais écrire du code pour vérifier tous les fichiers dans le répertoire du contrôleur. scandir fonctionnerait probablement. :) – Ms01

+0

Aussi longtemps que vous êtes sûr qu'aucune URL ne correspondra à un nom de contrôleur. Je dis toujours que "i/string" est meilleur. Si vous décidez plus tard que vous avez besoin de vidéos, vous ne pourrez pas le faire sans 'v/string'. Idem si vous voulez router des URL ou autre chose plus tard. Votre "espace de noms aléatoire" serait déjà possédé par des images. –

Questions connexes