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', 
  '...'=>'...'
)

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();

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.


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;


11

Als Ergänzung

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

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


3

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


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

1

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

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

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

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

// Methode


-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];
}

Es gibt vordefinierte Funktionen wie $ this-> router-> fetch_class () und fetch_method (), die wir nicht manuell ausführen müssen.
Naveed Ramzan
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.