Los Controladores

Los controladores son el corazón de tu aplicación, ya que determinan cómo deben manejarse las solicitudes HTTP.

¿Qué es un controlador?

Un controlador es simplemente un archivo de clase cuyo nombre se puede asociar a un URL.

Veamos esta URL:

ejemplo.com/index.php/blog/

En el ejemplo anterior, CodeIgniter intentaría encontrar un controlador llamado Blog.php y cargarlo. Cuando el nombre de un controlador coincida con el primer segmento de un URL, se cargará.

Nuestro primer ¡Hola Mundo!

Vamos a crear un controlador simple para que puedas verlo en acción. Usando tu editor de texto, crea un archivo llamado Blog.php, y coloca el siguiente código en él:

<?php
class Blog extends CI_Controller {

        public function index()
        {
                echo 'Hola Mundo!';
        }
}

Luego guarda el archivo en la carpeta application/controllers/

Importante

El archivo debe llamarse 'Blog.php', con una 'B' mayúscula.

Ahora visita tu sitio usando una URL similar a esta:

ejemplo.com/index.php/blog/

Si lo hiciste bien, deberías ver:

Hola Mundo!

Importante

Los nombres de las clases deben comenzar con una letra mayúscula.

Esto es válido:

<?php
class Blog extends CI_Controller {

}

Esto no es válido:

<?php
class blog extends CI_Controller {

}

Además, siempre asegúrate de que el controlador extienda desde la clase de controlador principal para que pueda heredar todos sus métodos.

Los métodos

En el ejemplo anterior, el nombre del método es index(). El método "index" siempre se carga de forma predeterminada si el segundo segmento de la URL está vacío. Otra forma de mostrar el mensaje de "Hola mundo" sería esta:

ejemplo.com/index.php/blog/index/

El segundo segmento del URI determina qué método se llama en el controlador.

Vamos a intentarlo. Agrega un nuevo método a tu controlador:

<?php
class Blog extends CI_Controller {

        public function index()
        {
                echo 'Hola Mundo!';
        }

        public function comentarios()
        {
                echo 'Mira esto!';
        }
}

Ahora carga la siguiente URL para ver el método "comentarios":

ejemplo.com/index.php/blog/comentarios/

Deberías ver tu nuevo mensaje.

Pasando Segmentos de URL a los métodos

Si la URL contiene más de dos segmentos, se pasarán al método como parámetros.

Por ejemplo, digamos que tienes una URL como esta:

ejemplo.com/index.php/productos/zapatos/sandalias/123

Al método se le pasarán los segmentos de la URL 3 y 4 ("sandalias" y "123") como parámetros:

<?php
class Productos extends CI_Controller {

        public function zapatos($tipo, $id)
        {
                echo $tipo;
                echo $id;
        }
}

Importante

Si estás utilizando la función de enrutamiento de URL , los segmentos pasados ​​al método serán los direccionados.

Definición de un controlador predeterminado

Se le puede indicar a CodeIgniter que cargue un controlador predeterminado cuando no hay una URL, como será el caso cuando solo se solicite la URL de la raíz de tu sitio. Para especificar un controlador predeterminado, abre el archivo application/config/route.php y establece esta variable:

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

Donde 'blog' es el nombre de la clase de controlador que deseas utilizar. Si ahora cargas el archivo principal index.php sin especificar ningún segmento de URI, verás el mensaje "Hola Mundo" de forma predeterminada.

Para obtener más información, consulta la sección "Rutas reservadas" del apartado "Enrutamiento de las URL".

Remapear las llamadas a métodos

Como se indicó anteriormente, el segundo segmento del URI típicamente determina qué método se llama en el controlador.

CodeIgniter te permite anular este comportamiento mediante el uso del método _remap()

public function _remap()
{
        // Tu código aqui...
}

Importante

Si el controlador contiene el método llamado _remap(), siempre será llamado independientemente de lo que contenga la URL. Anula el comportamiento normal en el que la URL determina a qué método se llama, lo que nos permite definir nuestras propias reglas de enrutamiento de métodos.

La llamada al método anulado (generalmente el segundo segmento de la URL) se pasará como un parámetro al método _remap()

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

Cualquier segmento extra después del nombre del método se pasa a _remap() como un segundo parámetro opcional. Este array se puede utilizar en combinación con call_user_func_array() de PHP para emular el comportamiento predeterminado de CodeIgniter.

Ejemplo:

public function _remap($method, $params = array())
{
        $method = 'process_'.$method;
        if (method_exists($this, $method))
        {
                return call_user_func_array(array($this, $method), $params);
        }
        show_404();
}

Procesando la salida

CodeIgniter tiene una clase de salida que se encarga de enviar automáticamente los datos renderizados al navegador web, se puede encontrar más información sobre esto en las páginas Views y Output Class, sin embargo, en algunos casos, es posible que desees post-procesar los datos finalizados de alguna manera y enviarlos al navegador tu mismo, CodeIgniter te permite agregar un método llamado _output() a tu controlador que recibirá los datos de salida finalizados.

Importante

Si el controlador contiene un método llamado _output(), será siempre llamado por la clase Output en lugar de hacerse eco de los datos finales directamente. El primer parámetro del método contendrá la salida finalizada.

Aquí hay un ejemplo:

public function _output($salida)
{
        echo $salida;
}

Nota

Ten en cuenta que el método _output() recibirá los datos en su estado finalizado, los datos de referencia y de uso de la memoria se procesarán, se escribirán los archivos de caché, si tienes habilitado el almacenamiento en caché, y se enviarán los encabezados, si usas esa característica, antes de transferirlos al método _output(). Para tener la salida del controlador en la memoria caché, el método _output() puede usar:

if ($this->output->cache_expiration > 0)
{
    $this->output->_write_cache($salida);
}

Si estás utilizando esta característica, el temporizador de ejecución de la página y las estadísticas de uso de la memoria pueden no ser perfectamente exactos, ya que no tendrán en cuenta ningún procesamiento adicional que realice, para una forma alternativa de controlar la salida antes de que se realice el procesamiento final, consulta los métodos disponibles en Output Library.

Métodos privados

En algunos casos, es posible que deseemos que ciertos métodos estén ocultos al acceso público. Para lograr esto, simplemente declaramos el método como privado o protegido y no se servirá a través de una solicitud de URL. Por ejemplo, si tuvieramos un método como este:

private function _utility()
{
        // some code
}

Tratar de acceder a él a través de la URL, como esto, no funcionará:

ejemplo.com/index.php/blog/_utility/

Nota

La prefijación de los nombres de los métodos con un guión bajo también evitará que se llamen, esta es una característica heredada que se deja para compatibilidad con versiones anteriores de CodeIgniter.

Organizando los controladores en subdirectorios

Si estás creando una aplicación grande, es posible que desees organizar jerárquicamente o estructurar tus controladores en subdirectorios. CodeIgniter te permite hacer esto.

Simplemente crea subdirectorios en la carpeta application/controllers/ y coloca los controladores dentro de ellos.

Al usar esta función, el primer segmento de la URL debe especificar la carpeta. Por ejemplo, digamos que tienes un controlador ubicado aquí:

application/controllers/productos/Zapatos.php

Para llamar al controlador anterior, la URL tendrá un aspecto similar al siguiente:

ejemplo.com/index.php/productos/zapatos/mostrar/123

Cada uno de los subdirectorios puede contener un controlador predeterminado al que se llamará si la URL solo contiene el subdirectorio. Simplemente colocamos un controlador que coincida con el nombre de nuestro 'default_controller' como se especifica en el archivo application/config/routes.php

CodeIgniter también nos permite volver a asignar las URI mediante su función de 'Enrutamiento de URL'.

La Clase Constructor

Si pretendes usar un constructor en cualquiera de tus Controladores, DEBES colocar la siguiente línea de código en él:

parent::__construct();

La razón por la que esta línea es necesaria es porque tu constructor local anulará el de la clase del controlador principal, por lo que debemos llamarlo manualmente.

Ejemplo:

<?php
class Blog extends CI_Controller {

        public function __construct()
        {
                parent::__construct();
                // Tu códi para el constructor
        }
}

Los constructores son útiles si necesitas establecer algunos valores predeterminados o ejecutar un proceso predeterminado cuando se crea una instancia de su clase. Los constructores no pueden devolver un valor, pero pueden hacer un trabajo predeterminado.

Nombres de métodos reservados

Como las clases del controlador ampliarán el controlador de la aplicación principal, debe tener cuidado de no nombrar los métodos de forma idéntica a los utilizados por esa clase, de lo contrario, las funciones locales los anularán. Consulta "Nombres reservados" para obtener una lista completa.

Además, nunca debemos tener un método con el mismo nombre que su nombre de clase. Si lo hacemos, y no hay ningún método __construct() en la misma clase, entonces el método Index::index(), por ejemplo , se ejecutará como un constructor de clases.