CodeIgniter: come ottenere informazioni su controller, azione, URL


124

Ho questi URL:

Come ottenere il nome del controller, il nome dell'azione da questi URL. Sono un principiante di CodeIgniter. Esistono funzioni di supporto per ottenere queste informazioni

Ex:

$params = helper_function( current_url() )

Dove $paramsdiventa qualcosa di simile

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

Risposte:


217

Potresti usare la classe URI :

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

Mi è stato anche detto che il seguente lavoro, ma attualmente non sono in grado di testare:

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

perché il mio controller ha una sottocartella, quindi $ this-> uri-> segment (1) restituisce il nome del controller potrebbe non essere corretto. Grazie per il tuo aiuto, utilizzo $ this-> router per ottenere le informazioni.
noname.cs

2
Per ottenere correttamente la directory puoi anche usare: $ this-> router-> fetch_directory ();
jmserra

6
Ehi, se stai usando Codeigniter 3, allora per Controller usa: $ this-> router-> class; per il metodo: $ questo-> router-> metodo; per Directory: $ this-> router-> directory; Documentazione: codeigniter.com/user_guide/installation/…
cartalot

$ this-> router-> fetch_class (); $ this-> router-> fetch_method (); Funziona.
Dinesh Patra

133

Invece di utilizzare i segmenti URI, dovresti fare questo:

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

In questo modo sai che stai sempre utilizzando i valori corretti anche se ti trovi dietro un URL instradato, in un sottodominio, ecc.


Ho appena scoperto che utilizzando questo metodo, non è possibile ottenere il nome del metodo di classe corretto quando si chiama una vista come modules::run('module/controller/action'). Mostra solo le informazioni sul router della pagina caricata. C'è un modo per superare questo problema?
Starx

Eccezionale! Qualche parola su quanto sia sicuro? Cioè può essere falsificato?
HellaMad

Questa dovrebbe essere la risposta accettata - o usando la scorciatoia: $ this-> router-> class
ChristoKiwi

1
No, se modifichi le rotte in routes.php, $this->routerrestituisce la classe in cui viene eseguito il codice, ma non il router effettivo mascherato con l'override. Entrambe le risposte sono abbastanza utili in base a ciò che vuoi fare.
Tibor Szasz

Questi metodi sono stati sconsigliati, utilizzare $this->router->classe $this->router->methodinvece
Richard

30

I metodi sono deprecati.

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

Puoi invece accedere alle proprietà.

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

Vedere la guida per l'utente di codeigniter

Metodi di instradamento URI fetch_directory (), fetch_class (), fetch_method ()

Con proprietà CI_Router::$directory, CI_Router::$classe CI_Router::$methoddi essere pubblica e le loro rispettive fetch_*()nulla non è più fare altro per tornare solo le proprietà - che non ha senso per tenerli.

Questi sono tutti metodi interni e non documentati, ma per ora abbiamo deciso di deprecarli per mantenere la compatibilità con le versioni precedenti per ogni evenienza. Se alcuni di voi li hanno utilizzati, ora puoi semplicemente accedere alle proprietà:

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


11

In aggiunta

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

Questa fetch_module()chiamata non funziona per me in CI 2.1.2. Non riesco a trovarlo nel file /system/router.php.
tim peterson

1
@timpeterson, è disponibile solo nel componente HMVC come detto nella risposta.
Starx

grazie, mi hai salvato
Barbz_YHOOL

7

Aggiornare

La risposta è stata aggiunta nel 2015 e i seguenti metodi sono ora deprecati

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

Ciao dovresti usare il seguente approccio

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

per questo scopo ma per usarlo devi estendere il tuo gancio dal CI_Controllere funziona come un incantesimo, non dovresti usare segmenti uri


3

Se utilizzi $ this-> uri-> segment, se le regole di riscrittura degli URL cambiano, la corrispondenza dei nomi dei segmenti andrà persa.


3

Usa questo codice ovunque nella classe o nelle biblioteche

    $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

L'ultimo segmento dell'URL sarà sempre l'azione. Si prega di ottenere in questo modo:

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

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

// fecth class la classe nel controller $ this-> router-> fetch_method ();

// metodo


-4

la classe controller non funziona con nessuna funzione.

quindi ti consiglio di utilizzare i seguenti script

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

Sono disponibili funzioni predefinite come $ this-> router-> fetch_class () e fetch_method (), quindi non è necessario eseguirle manualmente.
Naveed Ramzan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.