web-dev-qa-db-fra.com

Routes dans Codeigniter - automatiquement

J'ai un problème avec les itinéraires Codeigniter. Je souhaite que tous les utilisateurs enregistrés sur mon site obtiennent leur propre "répertoire", par exemple: www.example.com/username1, www.example.com/username2. Ce "répertoire" doit correspondre au contrôleur "polica", méthode "ogled", paramètre "username1".

Si j'aime bien cela, alors chaque contrôleur est mappé sur cette route: "polica/ogled/paramètre". Ce n'est pas ok:

$route["(:any)"] = "polica/ogled/$1";

Cela fonctionne, mais j'ai toujours saisi manuellement les informations dans routes.php:

$route["username1"] = "polica/ogled/username1";

Comment puis-je faire pour que cela soit automatisé?

UPDATE: Par exemple, j'ai un contrôleur nommé ads. Par exemple, si vous accédez au www.example.com/ads/ , Des annonces sont répertoriées. Si vous êtes sur www.example.com/username1, il y a des annonces par utilisateur username1. Il existe également un contrôleur user, profile, latest, ...

Mon routes.php actuel:

$route['oglasi'] = 'oglasi';
$route['(:any)'] = "polica/ogled/$1"
$route['default_controller'] = 'domov';
$route['404_override'] = '';

J'ai résolu le problème avec ce code:

$route['oglasi/(:any)'] = 'oglasi/$1';
$route['(:any)'] = "polica/ogled/$1"
$route['default_controller'] = 'domov';
$route['404_override'] = '';

Cordialement, Mario

7
Puzo

Le problème avec votre route est que vous utilisez: n'importe quelle correspondance, en fait ... N'IMPORTE QUELLE route, vous êtes donc pratiquement bloqué ici. Je pense que vous pourriez avoir deux solutions:

1) Vous pouvez réacheminer tous les contrôleurs de vos sites de manière sélective, par exemple:

$route['aboutus'] = "aboutus";
$route['where-we-are'] = "whereweare";
//And do this for all your site's controllers
//Finally:
$route['(:any)'] = "polica/ogled/$1";

Tous ces itinéraires doivent venir AVANT LE TOUT, car ils sont lus dans l'ordre dans lequel ils sont présentés, et si vous placez le: any au début, il sera heureux de sauter tout le reste.

EDIT après le commentaire:

Ce que je veux dire, c’est que si vous voulez faire correspondre un quelconque segment, cela signifie que vous ne pouvez utiliser aucun contrôleur (qui est, par défaut, le premier segment d’URI), car le routeur vous ré-acheminera toujours à l’aide de votre ordinateur. loi définie. Afin de permettre à CI d’exécuter d’autres contrôleurs (quels qu’ils soient, j’ai utilisé quelques pages Web communes, mais peuvent être littéralement tout), vous devez les autoriser en les excluant du réacheminement. Et vous pouvez y parvenir en les plaçant devant votre règle ANY, de sorte que chaque fois que CI passe au travers de vos règles de routage, il analyse d'abord celui que vous avez "échappé", et UNIQUEMENT s'il ne correspond à aucun élément trouvé dans l'URL, il est transmis. à la règle: TOUT.

Je sais que c'est quand même un code de verbosité, mais ils seront sûrement inférieurs à 6 Ko, comme vous l'avez dit. Étant donné que je ne connais pas la structure réelle de vos URL et de votre application Web, c'est la seule solution. cela me vient à l'esprit. Si vous fournissez des informations supplémentaires, telles que la forme des URL habituelles de votre application, je peux alors mettre à jour ma réponse.

/end edit

Ce n’est pas vraiment une solution pratique, car elle nécessitera beaucoup de code, mais si vous voulez une telle conception, c’est le seul moyen qui me vienne à l’esprit. Vous pouvez également utiliser des regexes comme $. route index, mais je ne pense pas que cela puisse fonctionner ici, car vos noms d’utilisateur sont difficilement compatibles de cette façon, mais je voulais simplement indiquer la possibilité.

OU

2) Vous pouvez modifier légèrement votre motif et attribuer un autre chemin aux noms d’utilisateur, quelque chose se trouvant le long de la ligne.

$route['user/(:any)'] = "polica/ogled/$1";

Cela générera néanmoins de jolies URL (et des adresses sémantiques) et évitera tout le souci de s'échapper des autres routes.

25
Damien Pirsy

voir ceci: http://www.web-and-development.com/codeigniter-minimize-url-and-remove-index-php/ qui inclut remove index. php/supprimer le 1er segment d'URL/supprimer le 2ème sigment d'URL/routage automatiquement.il sera très utile pour vous.

2
jiabo.zhang

Je me débattais avec ce même problème très récemment. J'ai créé quelque chose qui a fonctionné pour moi de cette façon:

Définissez un contrôleur "redirect" avec une méthode remap . Cela vous permettra de regrouper les requêtes envoyées au contrôleur avec toute chaîne de variable précédente en une seule fonction. Donc, si une requête est faite à http://yoursite/jeff/ ou http://yoursite/jamie, elle ne touchera pas ces méthodes, mais plutôt la fonction http://yoursite/ remap. (même si ces méthodes/noms n'existent pas et même si vous avez une fonction d'index, celle-ci le remplace). Dans la méthode _Remap, vous pouvez définir un commutateur conditionnel qui fonctionne ensuite avec le reste de votre code redirigeant l'utilisateur comme vous le souhaitez. 

Vous devez ensuite définir ce contrôleur de réorientation comme contrôleur par défaut et configurer vos itinéraires de la manière suivante:

$route['(.*)'] = "redirect/index/$1";
$route['default_controller'] = "redirect";

Au début, c'est un peu un problème car cela forcera fondamentalement tout ce qui est redirigé vers ce contrôleur, peu importe quoi et finalement à travers ce commutateur _remap.

Mais ce que vous pouvez faire est de définir les règles/routes que vous ne voulez pas respecter pour cette condition au-dessus de ces instructions de route.

c'est à dire

$route['myroute'] = "myroute";
$route['(.*)'] = "redirect/index/$1";
$route['default_controller'] = "redirect";

J'ai constaté que cela produisait un système de Nice dans lequel je pouvais avoir autant d'utilisateurs variables que ceux définis, dans lesquels je pouvais les rediriger facilement en fonction de ce qu'ils représentaient via un contrôleur.

1
Chamilyan

Une autre façon serait de déclarer un tableau avec vos contrôleurs internes et de rediriger tout le reste vers le contrôleur utilisateur, comme ceci dans votre fichier routes.php depuis codeigniter:

$controllers=array('admin', 'user', 'blog', 'api');
if(array_search($this->uri->segment(1), $controllers)){
    $route['.*'] = "polica/ogled/$1";
}
1
alex iancu