Il y a plusieurs façons de procéder. Juste être averti, ces deux solutions vous obliger à modifier les fichiers de base de CI. Cela signifie que vous ne pouvez pas mettre à niveau sans casser ces modifications. Malheureusement, les hameçons ne permettent pas de résoudre ce problème.
La manière simple:
ligne 188-195 dans le système/vodeigniter/CodeIgniter.php gérer la logique de ce qui se passe lorsqu'un contrôleur est introuvable.
Le plus dur, mais mieux:
Il y a un crochet (http://codeigniter.com/user_guide/general/hooks.html)
pre_controller
Mais cela ne fonctionnera pas! La raison en est que cela est appelé après que le contrôleur a été déterminé, mais avant que quelque chose ne soit réellement exécuté. En d'autres termes, il est trop tard. La prochaine plus tôt un
pre_system
est en fait trop tôt, car le routage n'a pas été fait et tout ce que vous faites le routage écrasés.
J'ai donc eu besoin que le premier contrôleur ait la même apparence, mais finisse par appeler un contrôleur différent. La raison en était que la page était consultée de façon hiérarchique, de sorte que ce serait le paragraphe d'une sous-section et ainsi de suite.
Ce que je ne faisais ajouter sur la ligne 43 du système/bibliothèques/Controller.php
$this->_ci_initialize();
En fait, je l'avais autoLoad les bibliothèques avant que le contrôleur a été appelé, parce que je trouve que les bibliothèques ne sont pas chargés avant que le contrôleur ne soit appelé et que j'en avais besoin parce que j'avais besoin de vérifier l'authentification de l'accès utilisateur et de me connecter directement au routage lui-même.Après avoir fait cela, j'ai étendu l'une des bibliothèques de base natives qui ont été chargées automatiquement (dans ce cas, pour des raisons spécifiques d'application), puis j'ai exécuté le réacheminement. J'ai appelé ce code au début, puis mis ma logique après. Ceci est un exemple de ce que ma logique de réacheminement ressemble
if ($this->segment(1) == 'institute')
{
if (! in_array($this->segment(3), $course))
{
$RTR->set_class('courseClass');
$RTR->set_method('index');
if (! $this->segment(4))
{
$RTR->set_class('course');
$RTR->set_method('index');
}
else
{
$RTR->set_class('course');
$RTR->set_method($this->segment(3));
}
}
L'original est beaucoup plus long. Je devrais probablement envisager d'écrire une sorte de plugin ou une façon supérieure de gérer la réécriture plutôt que la logique idiote spagetti. Cependant, j'avais besoin d'un contrôle grain extrêmement fin des contrôleurs appelés en fonction des URL. Cela vous donnera littéralement le contrôle du mode de dieu sur votre contrôleur basé sur les URLs. Est-ce un hack? Oui. Est-il inélégant? Absolument. Mais j'avais besoin de ça. Rappelez-vous juste que cela modifie les fichiers de base, vous ne pouvez pas facilement mettre à jour après. Je pense que le cadre Kohana a une solution à cela.
Ceci est tellement plus complexe que je l'avais prévu. Je m'attendais à un "bien sûr, c'est facile!" sorte de réponse: P Merci pour votre contribution. En ce moment, j'explore la résolution de mon problème via mod_rewrite, pour une solution peut-être plus simple. – Will
Après beaucoup de lecture, j'ai découvert que cela peut être fait facilement, avec le fichier [routes.php] (http://codeigniter.com/user_guide/general/routing.html). – Will
Oups désolé j'ai oublié à ce sujet. J'ai examiné la situation lorsque j'ai implémenté ma solution, mais j'ai trouvé que c'était trop simple. Je pense que la raison pour laquelle je ne l'ai pas utilisée était parce que ça ne ferait que 3 niveaux de profondeur au maximum. En tout cas, j'espère que ma réponse résoudra la question de quelqu'un d'autre. – theAlexPoon