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', 
  '...'=>'...'
)
noname.cs
la source

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();
Sampson
la source
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.

Phil Sturgeon
la source
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;
lumos0815
la source
12

Autrement

$this->router->class
Luis Chanferoni
la source
11

En complément

$this -> router -> fetch_module(); //Module Name if you are using HMVC Component
Starx
la source
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

Muhammad Omer Aslam
la source
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.

monsterm
la source
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
Aslam Patel
la source
1

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

$this->uri->segment('last_segment');
PrakashG
la source
-1
$this->router->fetch_class(); 

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

// méthode

Fel
la source
-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];
}
Jun Takeshita
la source
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