CodeIgniter User Guide Version 1.6.1


Controladores

Los controladores son el corazón de tu aplicación, es el encargado de determinar, como las solicitudes HTTP deben ser manejadas.

Qué es un controlador?

Un controlador es simplemente un archivo de clase que es llamado en una forma que puede ser asociado con un URI.

considere esta URI:

www.your-site.com/index.php/blog/

En el ejemplo anterior, Codeigniter trataría de encontrar un controlador llamado blog.php y lo cargaría.

Cuando el nombre de un controlador coincide con el primer segmento de una URI, esta será cargada.

Vamos a intentarlo:  Hola mundo!

Vamos a crear un controlador sencillo, así lo podrás ver en acción. Usando tu editor de texto, cree un archivo llamado blog.php, y coloca dentro el siguiente código:

Luego guarda el archivo en tu carpeta application/controllers/.

Ahora vista tu sitio usando una URL similar a esto:

www.your-site.com/index.php/blog/

Si lo has hecho correctamente, deberías ver Hola mundo!.

Nota: Los nombres de Clases deben empezar con una letra mayúscula. En otras palabras, esto es válido:

<?php
class Blog extends Controller {

}
?>

Esto no es válido:

<?php
class blog extends Controller {

}
?>

También, siempre debes asegurarte de que tu controlador herede de la clase padre "Controller" así podrá heredar todas sus funciones.

Funciones

En el ejemplo anterior el nombre de la función es index(). La función "index" es siempre cargada por defecto si el segundo segmento de la URI está vacía. Otra forma de mostrar tu mensaje "Hola mundo!" podría ser esta:

www.your-site.com/index.php/blog/index/

El segundo segmento de la URI determina que función en el controlador será llamada.

Vamos a probarlo. Agrega una nueva función a tu controlador:

Ahora carga la siguiente URL para ver la función comment:

www.your-site.com/index.php/blog/comments/

Deberias ver el siguiente mensaje. Mira esto!

Pasando Segmentos URI a tus funciones

Si tu URI contiene mas de dos segmentos, ellos seran pasados a tu función como parámetros.

Por ejemplo, digamos que tienes una URI como esta:

www.your-site.com/index.php/products/shoes/sandals/123

A tu funcion se le pasaran los segmentos URI 3 y 4 ("sandals" y "123"):

<?php
class Products extends Controller {

    function shoes($sandals, $id)
    {
        echo $sandals;
        echo $id;
    }
}
?>

Importante:  Si estas usando la característica URI Routing, los segmentos pasados a tus funciones seran re-ruteadas.

Definiendo un Controlador por Defecto

Se le puede decir a CodeIgniter que cargue un controlador por defecto, cuando una URI no esta presente, ese sería el caso cuando solamente la raíz del sitio es llamada. Para especificar un controlador por defecto abre tu archivo application/config/routes.php y coloca este valor a la variable:

$route['default_controller'] = 'Blog';

Donde Blog es el nombre de la clase del controlador que tú quieres usar. Si ahora cargas tu archivo principal index.php sin especificar ningún segmento URI podrás ver el mensaje Hola Mundo! por defecto.

Remapeando llamadas a Funciones

Como señalamos anteriormente, el segundo segmento de la URI típicamente determina cual función en el controlador sera llamado. CodeIgniter te permite anular este comportamiento a través del uso de la función _remap():

function _remap()
{
    // Algún codigo por aquí...
}

Importante:  Si tu controlador contiene una función llamada _remap(), esta será siempre llamada independientemente de que contenga tu URI. Esto anula el normal comportamiento en el cual la URI determina que función es llamada, permitiéndote definir tus propias reglas de ruteo.

La llamada a la función anulada (típicamente el segundo segmento de la URI) será pasada como parámetro a la función _remap():

function _remap($method)
{
    if ($method == 'algun_metodo')
    {
        $this->$method();
    }
    else
    {
        $this->metodo_por_defecto();
    }
}

Procesando la Salida

CodeIgniter tiene una clase de salida que se encarga de enviar tus datos finales al navegador web automáticamente. Más información sobre esto puede ser encontrado en las páginas Views (vistas) y Output class (Clase Salida). En algunos casos, sin embargo, tu podrías querer post-procesar los datos finalizados en alguna forma para enviarlo al navegador por tu cuenta. CodeIgniter te lo permite agregando una función llamada _output() al controlador que recibe la salida de datos finalizada.

Importante:  Si tu controlador contiene una función llamada _output(), esta sera siempre llamada por la clase "Output" en lugar de imprimir el dato finalizado directamente. El primer parametro de la función deberá contener la salida finalizada.

Aqui tenemos un ejemplo:

function _output($output)
{
    echo $output;
}

Por favor note que tu funcion _output() deberá recibir el dato en su estado finalizado. El punto de referencia y el uso de memoria, los datos serán prestados, los archivos cache serán escritos (si tu tienes habilitado el cacheo), y las cabeceras serán enviadas (si usa esa caraterística) antes de que esta sea entregada a la función _output(). Si estas usando esta característica el tiempo de ejecucíon de la página y el uso de memoria podría no ser preciso ya que no toma en cuenta ninguno de los procesos que tu haces. Para una alternativa a la forma de controlar la salida antes de que ninguno de los procesos finales estén hechos, por favor vea los métodos disponibles en la clase Output.

Funciones Privadas

En algunos casos usted podría querer esconder ciertas funciones del acceso publico. Para hacer una funcion privada, simplemente agregue un guion bajo como prefijo y esta no podrá ser accedida via pedido URL. Por ejemplo, si tuvieras una función como esta:

function _utility()
{
  // algún codigo aquí
}

Tratar de accederlo via la URL, como esta, no funcionará:

www.your-site.com/index.php/blog/_utility/

Organizando Tus Controladores en sub-carpetas

Si tu estas construyendo una gran aplicación usted podría encontrar conveniente organizar tus controladores en sub-carpetas. CodeIgniter te permite hacer esto.

Simplemente debes crear las carpetas dentro de tu directorio application/controllers y ubicar tus clases de controladores dentro.

Nota:  Cuando usamos esta característica usando esta característica el primer segmento de tu URI debe especificar la carpeta. Por ejemplo, digamos que tienes un controlador ubicado aqui:

application/controllers/products/shoes.php

Para llamar al controlador anterior tu URI deberia ser algo similar a esto:

www.your-site.com/index.php/products/shoes/123

Cada una de tus sub-carpetas deberan contener un controlador por defecto el cual sera llamado si la URL contiene solamente la sub-carpeta. Simplemente nombra a tu controlador por defecto como lo especificaste en tu archivo application/config/routes.php

CodeIgniter tambien te permite remapear tus URIs usando su caracteristica URI Routing.

Constructores de Clase

Si tu piensas usar un constructor en cualquiera de tus Controladores, tu DEBES ubicar la siguiente linea de codigo dentro de el:

parent::Controller();

La razón de esta linea, es que es necesaria porque tu constructor local anularia al constructor de la clase padre Controller, por lo tanto necesitamso llamarlo manualmente.

Si no estas familiarizado con los constructores, en PHP4, un constructor es simplemente una funcion que tiene exactamente el mismo nombre que que la clase:

<?php
class Blog extends Controller {

       function Blog()
       {
            parent::Controller();
       }
}
?>

En PHP 5, los constructores siguen la siguiente sintaxis:

<?php
class Blog extends Controller {

       function __construct()
       {
            parent::Controller();
       }
}
?>

Los Constructores son utiles si necesitas colocar valores por defecto, o correr algon proceso cuando la clase es instanciada. Los constructores no pueden retorna un valor, pero pueden hacer algun trabajo por defecto.

Nombres de Funciones Reservadas

Desde que tus clases controlador heredan de la aplicacion principal controlador debes tener cuidado de no llamar a tus funciones de una forma identica a las que son usadas por las clases, de otro modo tus funciones locales las anularían. A continuación una lista de palabras reservadas. No llames a ninguna de tus funciones de igual forma a alguna de estas:


Si está usando PHP 4 hay algunos nombres adicionales más. Estos ÚNICAMENTE se aplican si está corriendo PHP 4.

Eso es todo!

Eso, en pocas palabras, es todo lo que necesita saber sobre controladores.