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


124

Tengo estas URL:

Cómo obtener el nombre del controlador, el nombre de la acción de estas URL. Soy CodeIgniter novato. ¿Hay alguna función auxiliar para obtener esta información?

Ex:

$params = helper_function( current_url() )

Donde se $paramsconvierte en algo como

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

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

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.


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;


11

Como una adición

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

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


3

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


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

1

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

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

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

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

// método


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

Hay funciones predefinidas disponibles como $ this-> router-> fetch_class () y fetch_method (), entonces no necesitamos hacerlo manualmente.
Naveed Ramzan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.