CodeIgniter: Comment obtenir des informations sur le contrôleur, l'action, l'URL


124

J'ai ces URL:

Comment obtenir le nom du contrôleur, le nom de l'action à partir de ces URL. Je suis un novice de CodeIgniter. Y a-t-il une fonction d'aide pour obtenir ces informations

Ex:

$params = helper_function( current_url() )

$paramsdevient quelque chose comme

array (
  'controller' => 'system/settings', 
  'action' => 'edit', 
  '...'=>'...'
)

Réponses:


217

Vous pouvez utiliser la classe URI :

$this->uri->segment(n); // n=1 for controller, n=2 for method, etc

On m'a également dit que le travail suivant, mais je suis actuellement incapable de tester:

$this->router->fetch_class();
$this->router->fetch_method();

parce que mon contrôleur a un sous-dossier, donc $ this-> uri-> segment (1) renvoie le nom du contrôleur peut-être incorrect. Merci pour votre aide, j'utilise $ this-> router pour obtenir les informations.
noname.cs

2
Pour obtenir le répertoire correctement, vous pouvez également utiliser: $ this-> router-> fetch_directory ();
jmserra

6
Hé si vous utilisez Codeigniter 3, alors pour Controller, utilisez: $ this-> router-> class; pour la méthode: $ this-> router-> method; pour le répertoire: $ this-> router-> directory; Documentation: codeigniter.com/user_guide/installation/…
cartalot

$ this-> router-> fetch_class (); $ this-> router-> fetch_method (); Ça marche.
Dinesh Patra

133

Au lieu d'utiliser des segments URI, vous devez faire ceci:

$this->router->fetch_class(); // class = controller
$this->router->fetch_method();

De cette façon, vous savez que vous utilisez toujours les valeurs correctes même si vous êtes derrière une URL routée, dans un sous-domaine, etc.


Je viens de découvrir qu'en utilisant cette méthode, vous ne pouvez pas obtenir le nom de méthode de classe correct lors de l'appel d'une vue comme modules::run('module/controller/action'). Il montre simplement les informations du routeur de la page chargée. Y a-t-il un moyen de surmonter cela?
Starx

Impressionnant! Un mot sur la sécurité? Ie peut-il être usurpé?
HellaMad

Cela devrait être la réponse acceptée - ou en utilisant le raccourci: $ this-> router-> class
ChristoKiwi

1
Pas si vous changez les routes dans routes.php, $this->routerretourne la classe dans laquelle le code s'exécute, mais pas le routeur réel masqué par le remplacement. Les deux réponses sont très utiles en fonction de ce que vous voulez faire.
Tibor Szasz

Ces méthodes ont été dépréciées, utilisez $this->router->classet à la $this->router->methodplace
Richard

30

Les méthodes sont obsolètes.

$this->router->fetch_class();
$this->router->fetch_method();

Vous pouvez accéder aux propriétés à la place.

$this->router->class;
$this->router->method;

Voir le guide de l'utilisateur de codeigniter

Méthodes de routage URI fetch_directory (), fetch_class (), fetch_method ()

Avec les propriétés CI_Router::$directory, CI_Router::$classet le fait d' CI_Router::$methodêtre public et leurs respectifs fetch_*()ne faisant plus rien d'autre pour simplement renvoyer les propriétés - cela n'a aucun sens de les conserver.

Ce sont toutes des méthodes internes non documentées, mais nous avons choisi de les déconseiller pour le moment afin de maintenir la rétrocompatibilité au cas où. Si certains d'entre vous les ont utilisés, vous pouvez maintenant simplement accéder aux propriétés à la place:

$this->router->directory;
$this->router->class;
$this->router->method;


11

En complément

$this -> router -> fetch_module(); //Module Name if you are using HMVC Component

Cet fetch_module()appel ne fonctionne pas pour moi dans CI 2.1.2. Impossible de le trouver dans le fichier /system/router.php.
tim peterson

1
@timpeterson, Il n'est disponible que dans le composant HMVC comme indiqué dans la réponse.
Starx

merci, vous m'avez sauvé
Barbz_YHOOL

7

Mettre à jour

La réponse a été ajoutée en 2015 et les méthodes suivantes sont désormais obsolètes

$this->router->fetch_class();  in favour of  $this->router->class; 
$this->router->fetch_method(); in favour of  $this->router->method;

Salut, vous devriez utiliser l'approche suivante

$this->router->fetch_class(); // class = controller
$this->router->fetch_method(); // action

à cette fin, mais pour l'utiliser, vous devez étendre votre crochet à partir du CI_Controlleret cela fonctionne comme un charme, vous ne devez pas utiliser de segments uri


3

Si vous utilisez $ this-> uri-> segment, si les règles de réécriture des URL changent, la correspondance des noms de segments sera perdue.


3

Utilisez ce code n'importe où dans la classe ou les bibliothèques

    $current_url =& get_instance(); //  get a reference to CodeIgniter
    $current_url->router->fetch_class(); // for Class name or controller
    $current_url->router->fetch_method(); // for method name

1

Le dernier segment de l'URL sera toujours l'action. Veuillez obtenir comme ceci:

$this->uri->segment('last_segment');

-1
$this->router->fetch_class(); 

// classe fecth la classe dans le contrôleur $ this-> router-> fetch_method ();

// méthode


-4

la classe de contrôleur ne fonctionne aucune fonction.

donc je vous recommande d'utiliser les scripts suivants

global $argv;

if(is_array($argv)){
    $action = $argv[1];
    $method = $argv[2];
}else{
    $request_uri = $_SERVER['REQUEST_URI'];
    $pattern = "/.*?\/index\.php\/(.*?)\/(.*?)$/";
    preg_match($pattern, $request_uri, $params);
    $action = $params[1];
    $method = $params[2];
}

Il existe des fonctions prédéfinies disponibles comme $ this-> router-> fetch_class () et fetch_method () alors nous n'avons pas besoin de le faire manuellement.
Naveed Ramzan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.