> Manuales > Manual de CodeIgniter

En CodeIgniter podemos crear controladores con distintos nombres de funciones, para dar lugar a diversas páginas que dependen del mismo controlador.

En el capítulo anterior del Manual de CodeIgniter, que venimos publicando en DesarrolloWeb.com, estuvimos explicando lo que son los controladores, la parte fundamental de las aplicaciones basadas en la arquitectura de desarrollo denominada MVC. Conocer los controladores es básico y nos permitirá hacer nuestras primeras pruebas con este framework PHP. A continuación explicaremos para qué sirven las distintas funciones o métodos que podemos incluir en los controladores.

CodeIgniter dispone de un mecanismo sencillo para dar pie a URLs distintas que dependen del mismo controlador. Es decir, podemos asociar a un controlador muchas páginas, con URL distintas, que se ejecutan llamando siempre a un mismo controlador.

Por ejemplo, pensemos que tenemos una tienda online de venta de productos informáticos. Entonces podríamos tener una URL donde se muestran los productos, pero a su vez tendremos muchas clasificaciones de productos y cada cliente podría ver una ficha completa con cada uno de ellos. Todas las fichas de productos se podrían meter dentro de un mismo controlador, dando lugar a distintas URL, como pueden ser las siguientes:

dominio.com/index.php/productos
dominio.com/index.php/productos/ordenadores
dominio.com/index.php/productos/monitores
dominio.com/index.php/productos/perifericos/raton_genius
dominio.com/index.php/productos/ordenadores/mac_mini/2gigas
dominio.com/index.php/productos/ordenadores/mac_mini/4gigas
...

Todas estas URL dependen del mismo controlador, que sería el controlador de productos (tal como se dijo en el anterior artículo sería la clase "Productos" que extiende la clase "Controller" y debemos colocar en el archivo "productos.php" dentro del directorio donde se colocan los controladores (application/controllers).

Como se puede ver, el primer nombre del directorio después del dominio y el index.php es el nombre del controlador, en este caso siempre "productos". Por eso todas las URL que teníamos antes dependen del mismo controlador. Sin embargo, las URL que he colocado aquí son un puro ejemplo, para que se pueda ver cómo se pueden generar URLs que dependen de un mismo controlador. Pero dependiendo de cómo deseemos organizar nuestro sitio web podríamos decidir hacer uso de otras URL para mostrar más o menos lo mismo. Lo bueno, como también se puede comprobar viendo esas URL, es que en CodeIgniter siempre se generan URLs sin paso de parámetros, es decir, siempre totalmente amistosas a motores de búsqueda.

El segundo directorio corresponde a los nombres de las funciones

Ahora que ya sabemos que el primer directorio después del index.php corresponde con el nombre del controlador, podemos observar el segundo directorio de las URL generadas con CodeIgniter. Éste se refiere al nombre de la función o método que atenderá esa solicitud dentro del controlador.

Si no se indica ningún nombre de función CodeIgniter siempre invoca a la función llamada index(), así pues, la URL:

dominio.com/index.php/productos

Será procesada por la función index() que coloquemos en el controlador. Este es un caso especial, porque no se ha indicado nombre de función, pero dadas URLs como estas:

dominio.com/index.php/productos/ordenadores
dominio.com/index.php/productos/monitores

Tendremos que generar dichas funciones en el controlador, como se puede ver en el siguiente código:

<?php
class Productos extends Controller {

   function index(){
      echo 'Esto es la portada de productos';
   }
   
   function ordenadores(){
      echo 'Aquí se muestran los productos de ordenadores';
   }
   
   function monitores(){
      echo 'Aquí se muestran los productos de monitores';
   }
}
?>

Como se puede ver, hemos creado dos nuevas funciones dentro de un controlador para productos, para poder mostrar dos tipos de productos distintos.

Aclaración: Estamos refiriéndonos siempre como funciones de los controladores, pero realmente deberíamos llamarles métodos, porque los controladores son clases y las clases tienen métodos y no funciones.

Tercer directorio y los siguientes son los parámetros que se envían a las funciones

Ahora vamos a observar otras URL que dependen del controlador de productos, pero que tienen más de un directorio adicional al nombre del controlador. Vimos que el primer directorio es el controlador, el segundo el método que se invocará dentro del controlador y ahora veamos que pasa con el tercer parámetro y los siguientes, en caso que haya.

dominio.com/index.php/productos/perifericos/raton_genius
dominio.com/index.php/productos/ordenadores/mac_mini/2gigas
dominio.com/index.php/productos/ordenadores/mac_mini/4gigas

Estos directorios adicionales son simples parámetros en los métodos del controlador. Así, por ejemplo, la primera de las URL que acabamos de ver se corresponde con el método "perifericos", pasándole el nombre del periférico que se desea ver "raton_genius". Este dato adicional se puede recibir en el método con un código como este:

function perifericos($modelo){
   echo 'Estás viendo el periférico ' . $modelo;
}

Así tenemos el método "perifericos" que recibe el parámetro modelo. Este parámetro tomará el valor del tercer directorio. Entonces en la URL:

dominio.com/index.php/productos/perifericos/raton_genius

Estaremos invocando el método perifericos() y pasando como valor en el parámetro $modelo la cadena "raton_genius".

Esto se puede complicar un poco más en URL como estas:

dominio.com/index.php/productos/ordenadores/mac_mini/2gigas

Como se puede comprobar, aquí estamos pasando dos parámetros al método ordenadores() del controlador "Productos", que podríamos procesar de una manera similar a esta:

function ordenadores($marca=null, $modelo=null){
   if (is_null($marca) && is_null($modelo)){
      echo 'Aquí se muestran los productos de ordenadores';
   }elseif(is_null($modelo)){
      echo 'Mostrando ordenadores de marca ' . $marca;
   }else{
      echo 'Mostrando ordenadores de marca ' . $marca . ' y modelo ' . $modelo;
   }
}

En la anterior función se comprueba qué parámetros se recibe en el método antes de dar por sentado que estamos recibiendo alguno de ellos. Procesará correctamente URLs como estas:

http://localhost/index.php/productos/ordenadores
http://localhost/index.php/productos/ordenadores/toshiba
http://localhost/index.php/productos/ordenadores/hp/pavillon590

Con todo lo que hemos visto hasta ahora de controladores, tenemos este código en el archivo "productos.php" del directorio "controllers".

<?php
class Productos extends Controller {

   function index(){
      echo 'Esto es la portada de productos';
   }
   
   function ordenadores($marca=null, $modelo=null){
      if (is_null($marca) && is_null($modelo)){
         echo 'Aquí se muestran los productos de ordenadores';
      }elseif(is_null($modelo)){
         echo 'Mostrando ordenadores de marca ' . $marca;
      }else{
         echo 'Mostrando ordenadores de marca ' . $marca . ' y modelo ' . $modelo;
      }
   }
   
   function monitores(){
      echo 'Aquí se muestran los productos de monitores';
   }
   
   function perifericos($modelo){
      echo 'Estás viendo el periférico ' . $modelo;
   }
}
?>

Esperamos que con lo que se sabe hasta el momento se puedan hacer las primeras pruebas con controladores en CodeIgniter. Sin embargo, hay que decir que aun no lo hemos visto todo con relación a los controladores, aunque lo dejaremos para el próximo artículo.

Miguel Angel Alvarez

Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...

Manual