CodeIgniter: cómo obtener información de controlador, acción, URL

Respuestas:

217

Podrías usar la clase URI :

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

También me han dicho que el siguiente trabajo, pero actualmente no puedo probar:

$this->router->fetch_class();
$this->router->fetch_method();
Sampson
fuente
porque mi controlador tiene una subcarpeta, entonces $ this-> uri-> segmento (1) devolver el nombre del controlador puede ser incorrecto. Gracias por su ayuda, uso $ this-> router para obtener la información.
noname.cs
2
Para obtener el directorio correctamente, también puede usar: $ this-> router-> fetch_directory ();
jmserra
66
Hola, si está usando Codeigniter 3, entonces para el uso del controlador: $ this-> router-> class; para Método: $ this-> router-> method; para Directorio: $ this-> router-> directorio; Documentación: codeigniter.com/user_guide/installation/…
cartalot
$ this-> router-> fetch_class (); $ this-> router-> fetch_method (); funciona.
Dinesh Patra
133

En lugar de usar segmentos URI, debe hacer esto:

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

De esa manera, sabe que siempre está utilizando los valores correctos, incluso si está detrás de una URL enrutada, en un subdominio, etc.

Phil Sturgeon
fuente
Me acabo de enterar que al usar este método, no se puede obtener el nombre correcto del método de clase cuando se llama a una vista como modules::run('module/controller/action'). Solo muestra la información del enrutador de la página cargada. ¿Hay alguna manera de superar esto?
Starx
¡Increíble! ¿Alguna noticia sobre lo seguro que es esto? Es decir, ¿esto puede ser falsificado?
HellaMad
Esta debería ser la respuesta aceptada, o utilizando el acceso directo: $ this-> router-> class
ChristoKiwi
1
No, si cambia las rutas en routes.php, $this->routerdevuelve la clase en la que se ejecuta el código, pero no el enrutador real enmascarado con la anulación. Ambas respuestas son bastante útiles en función de lo que quieres hacer.
Tibor Szasz el
Estos métodos han sido depicados, uso $this->router->classy en $this->router->methodcambio
Richard
30

Los métodos están en desuso.

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

Puede acceder a las propiedades en su lugar.

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

Consulte la guía del usuario de codeigniter

Métodos de enrutamiento URI fetch_directory (), fetch_class (), fetch_method ()

Con propiedades CI_Router::$directory, CI_Router::$classy CI_Router::$methodser público y sus respectivas fetch_*()ya no hacen nada más para devolver las propiedades, no tiene sentido conservarlas.

Esos son todos métodos internos no documentados, pero hemos optado por desaprobarlos por ahora para mantener la compatibilidad con versiones anteriores por si acaso. Si algunos de ustedes los han utilizado, ahora pueden acceder a las propiedades en su lugar:

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

De otra manera

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

Como una adición

$this -> router -> fetch_module(); //Module Name if you are using HMVC Component
Starx
fuente
Esta fetch_module()llamada no me funciona en CI 2.1.2. No puedo encontrarlo en el archivo /system/router.php.
Tim Peterson
1
@timpeterson, solo está disponible en el componente HMVC como se indica en la respuesta.
Starx
gracias, me salvaste
Barbz_YHOOL
7

Actualizar

La respuesta se agregó en 2015 y los siguientes métodos están en desuso ahora

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

Hola, deberías usar el siguiente enfoque

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

para este propósito, pero para usar esto necesita extender su gancho desde el CI_Controllery funciona como un encanto, no debe usar segmentos uri

Muhammad Omer Aslam
fuente
3

Si usa $ this-> uri-> segmento, si cambian las reglas de reescritura de URL, se perderá la coincidencia de nombres de segmentos.

monstruo
fuente
3

Use este código en cualquier lugar de la clase o bibliotecas

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

El último segmento de URL siempre será la acción. Por favor, ponte así:

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

// fecth class la clase en el controlador $ this-> router-> fetch_method ();

// método

Fel
fuente
-4

La clase de controlador no funciona ninguna función.

así que te recomiendo usar los siguientes scripts

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
fuente
Hay funciones predefinidas disponibles como $ this-> router-> fetch_class () y fetch_method (), entonces no necesitamos hacerlo manualmente.
Naveed Ramzan