CodeIgniter: So erhalten Sie Controller-, Aktions- und URL-Informationen

124

Ich habe diese URLs:

So erhalten Sie den Controllernamen und den Aktionsnamen von diesen URLs. Ich bin CodeIgniter-Neuling. Gibt es eine Hilfsfunktion, um diese Informationen zu erhalten?

Ex:

$params = helper_function( current_url() )

Wo $paramswird so etwas

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

Antworten:

217

Sie können die URI-Klasse verwenden :

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

Mir wurde auch gesagt, dass die folgenden Arbeiten, aber ich kann sie derzeit nicht testen:

$this->router->fetch_class();
$this->router->fetch_method();
Sampson
quelle
Da mein Controller einen Unterordner hat, gibt $ this-> uri-> segment (1) möglicherweise den falschen Controllernamen zurück. Vielen Dank für Ihre Hilfe, ich benutze $ this-> Router, um die Informationen zu erhalten.
noname.cs
2
Um das Verzeichnis korrekt abzurufen, können Sie auch Folgendes verwenden: $ this-> router-> fetch_directory ();
jmserra
6
Hey, wenn Sie Codeigniter 3 verwenden, verwenden Sie für Controller: $ this-> router-> class; für Methode: $ this-> router-> method; für Verzeichnis: $ this-> Router-> Verzeichnis; Dokumentation: codeigniter.com/user_guide/installation/…
cartalot
$ this-> router-> fetch_class (); $ this-> router-> fetch_method (); Es klappt.
Dinesh Patra
133

Anstatt URI-Segmente zu verwenden, sollten Sie Folgendes tun:

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

Auf diese Weise wissen Sie, dass Sie immer die richtigen Werte verwenden, auch wenn Sie sich hinter einer gerouteten URL, in einer Subdomain usw. befinden.

Phil Sturgeon
quelle
Ich habe gerade herausgefunden, dass Sie mit dieser Methode beim Aufrufen einer Ansicht wie nicht den richtigen Namen der Klassenmethode erhalten können modules::run('module/controller/action'). Es werden nur die Router-Informationen der geladenen Seite angezeigt. Gibt es eine Möglichkeit, dies zu überwinden?
Starx
Genial! Gibt es ein Wort darüber, wie sicher das ist? Dh kann das gefälscht werden?
HellaMad
Dies sollte die akzeptierte Antwort sein - oder die Verknüpfung verwenden: $ this-> router-> class
ChristoKiwi
1
Nicht wenn Sie die Routen in route.php ändern, wird $this->routerdie Klasse zurückgegeben, in der der Code ausgeführt wird, aber nicht der tatsächliche Router, der mit der Überschreibung maskiert ist. Beide Antworten sind sehr nützlich, je nachdem, was Sie tun möchten.
Tibor Szasz
Diese Methoden wurden beraubt, verwenden $this->router->classund $this->router->methodstattdessen
Richard
30

Die Methoden sind veraltet.

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

Sie können stattdessen auf die Eigenschaften zugreifen.

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

Siehe Codeigniter-Benutzerhandbuch

URI-Routing-Methoden fetch_directory (), fetch_class (), fetch_method ()

Mit Eigenschaften CI_Router::$directory, CI_Router::$classund CI_Router::$methodWesen Öffentlichkeit und ihre jeweiligenfetch_*() nicht mehr sonst etwas zu tun, nur die Eigenschaften zurückkehren - es macht keinen Sinn, sie zu halten.

Dies sind alles interne, nicht dokumentierte Methoden, aber wir haben uns entschieden, sie vorerst zu verwerfen, um die Abwärtskompatibilität für alle Fälle aufrechtzuerhalten. Wenn einige von Ihnen sie verwendet haben, können Sie jetzt stattdessen einfach auf die Eigenschaften zugreifen:

$this->router->directory;
$this->router->class;
$this->router->method;
lumos0815
quelle
12

Ein anderer Weg

$this->router->class
Luis Chanferoni
quelle
11

Als Ergänzung

$this -> router -> fetch_module(); //Module Name if you are using HMVC Component
Starx
quelle
Dieser fetch_module()Aufruf funktioniert bei CI 2.1.2 nicht. Kann es nicht in der Datei /system/router.php finden.
Tim Peterson
1
@timpeterson, Es ist nur in der HMVC-Komponente verfügbar, wie in der Antwort angegeben.
Starx
Danke, du hast mich gerettet
Barbz_YHOOL
7

Aktualisieren

Die Antwort wurde im Jahr 2015 hinzugefügt und die folgenden Methoden sind jetzt veraltet

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

Hallo, Sie sollten den folgenden Ansatz verwenden

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

Zu diesem Zweck, aber um dies zu verwenden, müssen Sie Ihren Haken aus dem heraus verlängern CI_Controllerund es funktioniert wie ein Zauber, Sie sollten keine Uri-Segmente verwenden

Muhammad Omer Aslam
quelle
3

Wenn Sie $ this-> uri-> segment verwenden und sich die Regeln zum Umschreiben von URLs ändern, geht die Übereinstimmung der Segmentnamen verloren.

monsterm
quelle
3

Verwenden Sie diesen Code überall in Klassen oder Bibliotheken

    $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
quelle
1

Das letzte Segment der URL ist immer die Aktion. Bitte machen Sie so:

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

// fecth class die Klasse in Controller $ this-> router-> fetch_method ();

// Methode

Fel
quelle
-4

Die Controller-Klasse funktioniert nicht mit Funktionen.

Daher empfehle ich Ihnen, die folgenden Skripte zu verwenden

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
quelle
Es gibt vordefinierte Funktionen wie $ this-> router-> fetch_class () und fetch_method (), die wir nicht manuell ausführen müssen.
Naveed Ramzan