Funciones en los controladores

  • Por
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.

Autor

Miguel Angel Álvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Jose Mujica

21/1/2010
Excelente
Sencillamente excelente. No habia trabajado con PHP y lo estoy entendiendo a mil por hora. Gracias

Radix-10

06/2/2010
Excelente
Me parece excelenta la forma en como desarrollo web esta mostrandonos este nuevo framework, la verdad es que desde hace tiempo he querido utilizar uno pero casi nunca entendia nada, pero he estado siguiendo este manual desde que salio, lo estan haciendo bien ojalá aprendamos mucho y podamos desarrollar nuestra próxima web usando este framework, estaré atento a todos los capitulos que hagan de este manual

Saludos desde Cali Colombia

Distriker

19/3/2010
Sin lugar a dudas...
Sin lugar a dudas este es uno de los mejores tutoriales que he encontrado en la web, y sobre todo en Desarrollo Web. Me encanta, CodeIgniter es facilísimo.

Saludos

Manuel

29/6/2010
Muy bueno el material
Hola primero que nada queria agradecerles esta muy bueno el material sobre CodeIgniter me ha aclarado muchas cosas que no entendia y pues tambien una sugerencia creo que hay un error en el primer parrafo ya que mencionan a CodeIgniter como un framework Javascript... Gracias!

pablox

18/11/2010
Consulta
Si no me confundo, este framework es de php y no de Javascript como dice el articulo en el comienzo.

"...y nos permitirá hacer nuestras primeras pruebas con este framework Javascript."

Salute!

midesweb

24/6/2011
Claro que sí! es un framework PHP
Gracias a los que me han avisado sobre la errata. Efectivamente, Codeigniter es un Framework PHP y no Javascript como se me había pasado en el primer párrafo.

Angel Rafael Mendez Coral

01/7/2012
aportacion
Hola mi nombre es angel y la verdad esque me estoy iniciando en este nuevo modelo de programacion y la verdad que es interesante, digo nuevo porque para mi es nuevo y aunq al principio me toco un proyecto asi pues aun no me he logrado a adaptarme pero me gustaria obtener mas información acerca de esto

Diego

10/10/2012
ayuda CodeIgniter
Básicamente tengo una pregunta.. Si tengo un controlador con varias funciones y deseo pasar esas funciones al mismo tiempo, En cada funcion tengo variables de modelos diferentes y necesito tenerlas cargadas. Pero no puedo cargar dos funciones al mismo tiempo.. Si carga la segunda no carga la primera..,alguien que me pueda ayudar.