2010-10-27 5 views
0

J'essaie d'en savoir plus sur le framework codeigniter en y portant un site web existant - quelque chose qui n'est pas trop complexe, c'est ce que j'ai pensé.Puis-je avoir un contrôleur par défaut appelé si le contrôleur appelé n'existe pas?

Actuellement, le site est répliquée pour ses utilisateurs et présente des données personnalisées basées sur l'URL, par exemple, Joe pourrait avoir son site à:

www.example.com/joe 
www.example.com/joe/random-page.php 

Et vous remplacer « Joe » avec un utilisateur donné prénom. Les URL doivent être structurées de la façon suivante:/joe/isnt FOR joe, c'est pour les visiteurs de joe, donc je ne peux pas me fier à une connexion d'utilisateur ou à une méthode de ce genre. Je pourrais passer à joe.example.com mais préférerais ne pas.

Y a-t-il un moyen de rendre ce jeu agréable avec Code Igniter?

Actuellement, il voudrait appeler le contrôleur joe. Ma première pensée est de trouver un moyen d'avoir un contrôleur par défaut appelé quand un contrôleur n'existe pas, mais si certains pros de CI ont des conseils sur une façon différente et meilleure de gérer cela, ce serait génial.

Répondre

1

Upgrade to CodeIgniter 2.0 et d'utiliser $ route ['404_override'] = 'controller'; ou installer des extensions modulaires qui font la même chose, mais pour l'instant ils utilisent $ route ['404'] à la place.

1

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.

+0

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

+0

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

+0

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

1

J'ai continué à lire les documents de CI après la publication d'Alex et trouvé des informations sur le routes.php file qui fait exactement ce dont j'avais besoin.

Il vous permet d'utiliser des expressions régulières pour réécrire les routes (URLs), un peu de la même manière que mod_rewrite, donc je pourrais enlever le nom d'utilisateur et finir par le passer comme un paramètre.

Questions connexes