Co­deI­g­ni­ter es preferido como framework para apli­ca­cio­nes web por los de­sa­rro­lla­do­res que priorizan la velocidad a un abanico avanzado de funciones. El objetivo central que ha guiado el diseño de este entorno de de­sa­rro­llo PHP de código abierto es, según la página web del proyecto, obtener el máximo en re­n­di­mie­n­to y fle­xi­bi­li­dad con un mínimo de código.

¿Qué es Co­deI­g­ni­ter?

Es un entorno de de­sa­rro­llo web escrito en PHP que presume de acelerar y optimizar el de­sa­rro­llo de apli­ca­cio­nes web gracias a un compacto diseño de software. La compañía de software no­r­te­ame­ri­ca­na EllisLab fue la encargada de su creación y de la pu­bli­ca­ción de su primera versión en febrero de 2006. Un año después de anunciar, el 9 de julio de 2013, que la compañía ya no disponía de los recursos ne­ce­sa­rios para continuar de­sa­rro­lla­n­do el software, el proyecto se vio be­ne­fi­cia­do por su ad­qui­si­ción por el British Columbia Institute of Te­ch­no­lo­gy (BCIT). El código fuente de Co­deI­g­ni­ter es di­s­tri­bui­do con una licencia MIT y puede de­s­ca­r­gar­se desde la pla­ta­fo­r­ma GitHub. La última versión estable del entorno de de­sa­rro­llo, Co­deI­g­ni­ter 3.1.2, se ofrece para su descarga gratuita en la página oficial del proyecto.

La es­tru­c­tu­ra de Co­deI­g­ni­ter

El diseño orientado al re­n­di­mie­n­to de este framework de de­sa­rro­llo web se revela en su parca ar­qui­te­c­tu­ra, pues se basa en el patrón Modelo-Vista-Co­n­tro­la­dor (MVC). El principio fu­n­da­me­n­tal que sustenta a la ar­qui­te­c­tu­ra de de­sa­rro­llo MVC es la estricta se­pa­ra­ción entre el código y la pre­se­n­ta­ción, gracias a una es­tru­c­tu­ra modular de software y a la ex­te­r­na­li­za­ción del código PHP. Esta se­pa­ra­ción se realiza en estos tres grupos: el modelo (model), la vista (view) y el co­n­tro­la­dor (co­n­tro­ller), que ex­pli­ca­mos a co­n­ti­nua­ción:

  • El modelo re­pre­se­n­ta la es­tru­c­tu­ra de datos de una apli­ca­ción web de­sa­rro­lla­da con Co­deI­g­ni­ter. Para ello, en el código fuente se definen las de­no­mi­na­das clases (“model classes”), que contienen funciones es­pe­cia­les con las cuales se puede recibir, insertar o ac­tua­li­zar la in­fo­r­ma­ción de la base de datos.
  • La vista es aquello que se le presenta al usuario final. Por lo general, se trata de un documento HTML en el cual se ha insertado contenido de forma dinámica con PHP, co­n­vi­r­tié­n­do­se en una especie de plantilla. Co­deI­g­ni­ter también permite definir fra­g­me­n­tos de una página web como la cabecera y el pie de página o páginas RSS como vista. No­r­ma­l­me­n­te las apli­ca­cio­nes web utilizan varias vistas, que toman su contenido desde el mismo modelo, de tal forma que es posible presentar diversas ca­ra­c­te­rí­s­ti­cas del programa en vistas di­fe­re­n­tes.
  • El co­n­tro­la­dor media entre el modelo, la vista y cualquier otro recurso necesario para procesar una petición HTTP o generar una página web de forma dinámica. Este co­m­po­ne­n­te recibe las pe­ti­cio­nes entrantes, valida la entrada, se­le­c­cio­na la vista deseada y le entrega el contenido que el modelo ha cargado desde una base de datos.

En este esquema se aprecia cla­ra­me­n­te cómo se produce la in­ter­ac­ción en la ar­qui­te­c­tu­ra MVC:

La es­tru­c­tu­ra MVC permite diseñar software de forma flexible, ya que se pueden su­b­s­ti­tuir, editar y re­uti­li­zar los módulos in­di­vi­dua­les de pro­gra­ma­ción muy fá­ci­l­me­n­te. Los cambios que se realizan en un co­m­po­ne­n­te no suelen tener ningún efecto en el código fuente de otros co­m­po­ne­n­tes, siempre y cuando estos cambios no tengan lugar en los puntos de contacto entre unos y otros.

La me­n­cio­na­da división entre la lógica del programa y la pre­se­n­ta­ción resulta en un código claro y bien es­tru­c­tu­ra­do. Esto es lo que hace que las apli­ca­cio­nes web diseñadas según un patrón MVC estén co­n­si­de­ra­das como fáciles de mantener, puesto que, en caso de error o fallo, la fuente suele en­co­n­trar­se en uno solo de los co­m­po­ne­n­tes. Esta se­pa­ra­ción también permite de­sa­rro­llar la lógica y el diseño de forma in­de­pe­n­die­n­te. Si los de­sa­rro­lla­do­res del backend y del frontend trabajan en paralelo, las apli­ca­cio­nes se pueden terminar mucho más rá­pi­da­me­n­te.

Aun cuando Co­deI­g­ni­ter utiliza el patrón MVC, los usuarios no están obligados a hacerlo por completo. Si el co­n­tro­la­dor y la vista son co­m­po­ne­n­tes obli­ga­to­rios, no sucede lo mismo con el modelo, cuyo uso como vínculo con la base de datos es meramente opcional. Una apli­ca­ción realizada con Co­deI­g­ni­ter también puede rea­li­zar­se, además, con una ar­qui­te­c­tu­ra MVC je­rá­r­qui­ca (HMVC), que ampliaría el patrón MVC clásico con una lógica je­rá­r­qui­ca.

En­te­n­die­n­do el flujo de apli­ca­ción de Co­deI­g­ni­ter

El framework PHP Co­deI­g­ni­ter funciona con un URL: para dirigirse al co­n­tro­la­dor, como unidad de control central entre la vista y el modelo, es necesario in­tro­du­cir un URL en la barra de búsqueda del navegador web. Para ello, los de­sa­rro­lla­do­res crean las de­no­mi­na­das clases de co­n­tro­la­dor, archivos PHP con diversas funciones que permiten cargar librerías, ex­te­n­sio­nes o helpers, es­ta­ble­cer co­ne­xio­nes a bases de datos, integrar un modelo o se­le­c­cio­nar una vista de­te­r­mi­na­da.

El flujo de apli­ca­ción de Co­deI­g­ni­ter se basa en el siguiente esquema de URL básico:

example.com/class/function/parameter

Al dominio (example.com) le sigue una clase de co­n­tro­la­dor, a la cual hay que dirigirse, así como una función de co­n­tro­la­dor es­pe­cí­fi­ca. El esquema lo cierran los pa­rá­me­tros op­cio­na­les, que se utilizan para asignar al co­n­tro­la­dor se­le­c­cio­na­do ciertos ide­n­ti­fi­ca­do­res o variables.

En la práctica, un URL de Co­deI­g­ni­tes podría tener esta co­n­s­tru­c­ción:

example.com/news/article/511

Este URL se dirige al co­n­tro­la­dor news en el dominio example.com y le solicita ejecutar la función article, para, por ejemplo, cargar una vista homónima para la vista de artículo. Los pa­rá­me­tros op­cio­na­les, que se entregan al co­n­tro­la­dor con el URL, son los en­ca­r­ga­dos de indicar qué contenido se ha de solicitar de la base de datos con el modelo, en este caso un artículo ide­n­ti­fi­ca­do como 511.

En la co­n­fi­gu­ra­ción de salida, Co­deI­g­ni­ter ejecuta el index.php en cada URL de la apli­ca­ción:

example.com/index.php/news/article/511

Este archivo PHP contiene in­fo­r­ma­ción sobre el lugar donde se en­cue­n­tran los archivos centrales del framework, así como las librerías, ex­te­n­sio­nes o helpers in­te­gra­dos y sobre el di­re­c­to­rio donde están de­po­si­ta­dos los archivos de la apli­ca­ción. El archivo index.php también sirve para ini­cia­li­zar todos los recursos básicos.

Si Co­deI­g­ni­ter se ejecuta en un servidor Apache HTTP, se puede eliminar el index.php de la dirección de la apli­ca­ción con mod_rewrite, para mostrar al usuario y a los crawlers del buscador di­re­c­cio­nes web “limpias”. Los de­sa­rro­lla­do­res añaden el siguiente código en el archivo .htaccess del servidor web:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

La es­tru­c­tu­ra fu­n­da­me­n­tal del framework se apoya en primera instancia en clases de co­n­tro­la­dor, clases de modelo y pla­n­ti­llas de vista.

Clases de co­n­tro­la­dor

Co­deI­g­ni­ter permite a los de­sa­rro­lla­do­res programar co­n­tro­la­do­res in­di­vi­dua­les como clases definidas por el usuario. Para ello crean un archivo PHP separado para cada co­n­tro­la­dor en el di­re­c­to­rio ap­pli­ca­tion/co­n­tro­lle­rs/. Los co­n­tro­la­do­res encierran la lógica de pro­gra­ma­ción propia de una apli­ca­ción web de­sa­rro­lla­da con Co­deI­g­ni­ter y se crean como subclases de la clase CI_Co­n­tro­ller. En el código fuente se realiza con ayuda de la palabra clave extends.

class News extends CI_Controller {
}

Como clase su­bo­r­di­na­da, News hereda todas las funciones de la vi­si­bi­li­dad public y protected de la clase CI_Co­n­tro­ller.

Im­po­r­ta­n­te

las palabras clave public, protected o private ayudan a definir la vi­si­bi­li­dad de una propiedad o funciones en PHP. Si un elemento se declara como public, todas las clases de un software tienen acceso a él. Si este acceso a clases padre y a sus re­s­pe­c­ti­vas subclases ha de limitarse, se utiliza la palabra clave protected. Y si un elemento es declarado private, solo está di­s­po­ni­ble a la clase que define el elemento.

Cada clase de co­n­tro­la­dor definida por el usuario también ha de contener una función co­n­s­tru­c­tor, con la cual se pueden integrar librerías, un modelo de datos, bases de datos o clases helper. Desde PHP5, se utiliza __construct() como estándar.

<?php
class News extends CI_Controller {
    public function __construct() {             //define el constructor
        parent::__construct();                            //invoca al constructor de la clase superior
        $this->load->helper('url');                 //carga una clase helper para el trabajo con URL
        $this->load->helper('file');                // carga una clase helper para el trabajo con archivos
        $this->load->database();                        //carga una base de datos
        $this->load->model('News_model');     //carga un modelo con el nombre „News_model“    
}
?>

Este ejemplo, con ex­pli­ca­cio­nes a cada línea de código, muestra la clase News como subclase de CI_Co­n­tro­ller. La función co­n­s­tru­c­tor __construct() comprende e integra dos clases helper, una base de datos y el modelo de datos News_model.

Nota

Todas las clases de co­n­tro­la­dor que se definen en PHP para Co­deI­g­ni­ter se tienen que escribir con mayúscula inicial (News en lugar de news). En cambio, en la dirección URL se escriben con minúscula.

Funciones del co­n­tro­la­dor

Una vez fijada la es­tru­c­tu­ra básica del co­n­tro­la­dor definido por el usuario, el siguiente paso es continuar con la verdadera lógica de pro­gra­ma­ción en la forma de funciones del co­n­tro­la­dor, con las cuales se invocan vistas o se in­ter­ac­cio­na con un modelo de datos integrado.

Para permitir que el co­n­tro­la­dor cargue una vista, el documento HTML base se ha de guardar como archivo PHP en el di­re­c­to­rio ap­pli­ca­tion/views/. Una vista sencilla para la página de un artículo podría tener el siguiente código:

<!DOCTYPE html>
<html lang="de">
  <head>
    <meta charset="utf-8">
    <title><?php echo $title; ?></title>
 </head>
 <body >
    <h1><?php echo $headline ?></h1>
    <p><?php echo  $content_body ?></p>
 </body>
</html>
Nota

los do­cu­me­n­tos HTML que contienen código PHP se deben guardar como documento PHP (.php). Solo así se garantiza que el in­té­r­pre­te de PHP del servidor web ejecute los scripts y no entregue el código PHP como texto plano.

Es necesario crear una función para poder cargar una vista en el co­n­tro­la­dor. En el siguiente ejemplo vemos como la función article() se utiliza para cargar la vista article.php:

public function article() {
    if (!file_exists(application/views/article.php)) {
        show_404();
    }
$this->load->view('article');
}

Este fragmento de código se lee de la siguiente forma: en primer lugar, Co­deI­g­ni­ter comprueba que el di­re­c­to­rio ap­pli­ca­tion/views/ contenga un archivo con el nombre article.php. Esta solicitud se realiza mediante la partícula li­n­güí­s­ti­ca if y la condición negadora (!) file exists (). Si se da esta condición y no se encuentra este archivo en el di­re­c­to­rio, if devuelve el valor TRUE y Co­deI­g­ni­ter ejecuta la función show_404() indicada en la línea siguiente a if. Al usuario se le in­fo­r­ma­ría entonces de la in­e­xi­s­te­n­cia de este archivo so­li­ci­ta­do. Si la condición if no se cumple y !file_exists se evalúa como FALSE, entonces Co­deI­g­ni­ter ejecuta la función $this->load->view('article'), con la cual se carga en la apli­ca­ción el archivo co­rre­s­po­n­die­n­te como vista.

Siempre y cuando el archivo so­li­ci­ta­do tenga formato PHP, este puede ser escrito sin sufijo en la función view(), pero si se tienen que cargar otros formatos entonces es obli­ga­to­rio indicar el sufijo.

Co­deI­g­ni­ter suele uti­li­zar­se en apli­ca­cio­nes web dinámicas, que muestran a los usuarios páginas web generadas de forma dinámica en lugar de páginas HTML estáticas. Esto es posible si los datos que contiene la vista se co­rre­s­po­n­den con los pa­rá­me­tros que Co­deI­g­ni­ter recibe con la dirección URL.

example.com/news/article/511

Hasta ahora, con la función $this->load->view('article') solo se ha cargado una vi­sua­li­za­ción para el artículo. Ahora se tratará de integrar el contenido vinculado al parámetro 511, dando por supuesto que esta cifra ide­n­ti­fi­ca a un de­te­r­mi­na­do texto mediante un sistema de gestión de bases de datos. Para poder cargarlo en el programa desde la base de datos se ha de completar el ejemplo anterior de tal forma que se invoque al modelo integrado en la función __construct().

public function article($id) {
    if (!file_exists(application/views/article.php)) {
        show_404();
    }
    $data = $this->News_model->get_data($id);
    $this->load->view('article', $data);}

El argumento de función entregado en primer lugar, aquí con el nombre de variable $id, co­rre­s­po­n­de al ide­n­ti­fi­ca­dor en el URL (511 en nuestro ejemplo). La función de modelo get_data() sirve para cargar desde la base de datos el contenido vinculado al ide­n­ti­fi­ca­dor. El método view() invoca la vista article y le tra­n­s­fie­re los datos en la forma de array aso­cia­ti­vo ($data). El modelo News_model entrega así al co­n­tro­la­dor News los datos se­le­c­cio­na­dos que este ha entregado a la vista.

Todas las ope­ra­cio­nes que tienen que ver con la petición de datos se almacenan en el modelo in­vo­lu­cra­do en ella.

Clases modelo

En Co­deI­g­ni­ter los modelos se utilizan para preparar funciones con las cuales ejecutar ope­ra­cio­nes con la base de datos. Exac­ta­me­n­te igual que con las clases co­n­tro­la­dor, las clases modelo también se pueden definir li­bre­me­n­te en el framework.

Para crear una clase modelo primero se le asigna un nombre, en este caso News_model. Igual que las clases co­n­tro­la­dor, todas las clases modelo que se definen son subclases de la clase padre CI_Model. La herencia se realiza mediante la clave extends. Las clases modelo también integran bases de datos y otros recursos con la función _construct().

class News_model extends CI_Model {
    public function __construct() {
        parent::__construct();
        $this->load->database(); 
    }
}

A esta es­tru­c­tu­ra básica le siguen las llamadas funciones modelo, en las cuales los pro­gra­ma­do­res definen todas las ope­ra­cio­nes de bases de datos que el co­n­tro­la­dor ha de entregar a través del co­rre­s­po­n­die­n­te modelo.

Funciones modelo

Las clases modelo permiten a los de­sa­rro­lla­do­res definir funciones de forma in­di­vi­dual para las ope­ra­cio­nes de bases de datos. En un ejemplo anterior se utilizó la función get_data() en la clase co­n­tro­la­dor News para cargar contenido desde la base de datos a la vista. Ahora se define en el modelo qué ope­ra­cio­nes de base de datos se ocultan tras esta función.

class News_model extends CI_Model {
    public function __construct() {
        parent::__construct();
        $this->load->database(); 
    }
public function get_data($id) {
     $this->db->select('content');
     $this->db->from('example_table');
     $this->db->where('id', $id);
    $query = $this->db->get();
    return $query->result();
}

En la clase modelo News_model se define la función get_data() como operación de base de datos (db), que solicita la columna del registro indicada con select() con el ide­n­ti­fi­ca­dor $id desde la tabla indicada en from() mediante get() y la devuelve como array de datos con ayuda de la función result(). Un modelo de datos dispone ge­ne­ra­l­me­n­te de una gran variedad de funciones modelo. Los de­sa­rro­lla­do­res recurren para ello a la clase Query Builder, que abarca una serie de funciones pre­de­fi­ni­das para ope­ra­cio­nes base de datos clásicas. En la página web oficial de Co­deI­g­ni­ter puedes obtener una impresión general.

En­ru­ta­mie­n­to con Co­deI­g­ni­ter

La dirección URL indica a Co­deI­g­ni­ter qué clases y funciones co­n­tro­la­dor han de ser invocadas. Para ello, el framework utiliza el esquema clase/función/parámetro, un esquema básico que se puede modificar según las ne­ce­si­da­des. Co­deI­g­ni­ter dispone del archivo routes.php en el di­re­c­to­rio ap­pli­ca­tion/config/ que contiene un array de­no­mi­na­do $route, que es el que permite a los de­sa­rro­lla­do­res definir sus propios criterios de en­ru­ta­mie­n­to.

La co­n­fi­gu­ra­ción de salida incluye tres entradas estándar en el array $route: el co­n­tro­la­dor estándar, una regla de en­ru­ta­mie­n­to para el error 404 (enlace roto) y una regla para la su­b­s­ti­tu­ción au­to­má­ti­ca del guion (-) por el guion bajo (_):

$route['default_controller'] = 'home/welcome';
$route['404_override'] = 'home/welcome';
$route['translate_uri_dashes'] = FALSE;

La primera entrada estándar determina el co­n­tro­la­dor de la apli­ca­ción que Co­deI­g­ni­ter cargará si un URL no contiene más in­fo­r­ma­ción de en­ru­ta­mie­n­to aparte del dominio. En este ejemplo, la regla de en­ru­ta­mie­n­to define la clase co­n­tro­la­dor home como co­n­tro­la­dor estándar. Así, los usuarios que no pro­po­r­cio­nan in­fo­r­ma­ción sobre la página web a la que se dirigen en la dirección son re­di­ri­gi­dos a home y reciben la vista welcome. Lo habitual es redirigir al usuario a la página principal. Si no se define ningún co­n­tro­la­dor estándar, Co­deI­g­ni­ter muestra una página de error 404.

La segunda entrada en el array $route define a un co­n­tro­la­dor al cual se llama si el co­n­tro­la­dor invocado con el URL no se ha podido encontrar en los archivos de la apli­ca­ción. La regla de en­ru­ta­mie­n­to $route['404_override'] = 'home' so­bre­s­cri­be la página de error 404 habitual, para reenviar al usuario a la clase co­n­tro­la­dor home.

Por último, la tercera entrada en el array $route impide que se produzcan errores de en­ru­ta­mie­n­to por culpa del guion. Dado que el guion no es un signo válido para nombres de clases y funciones, en la co­n­fi­gu­ra­ción estándar ya se sustituye au­to­má­ti­ca­me­n­te.

Cuando se requiere crear una regla de en­ru­ta­mie­n­to nueva para una dirección dinámica, los de­sa­rro­lla­do­res web disponen con Co­deI­g­ni­ter de dos opciones: definir entradas de en­ru­ta­mie­n­to para URL dinámicos con Wildcards (comodines) o con ex­pre­sio­nes regulares.

El documento routes.php soporta dos tipos de comodín:

Nota

Las páginas web con un buen número de páginas de error 404 son difíciles de rastrear por los crawlers del buscador, di­fi­cu­l­ta­n­do a los bu­s­ca­do­res acceder al contenido relevante. Esto puede tener, además de efectos en la ex­pe­rie­n­cia de usuario, una in­flue­n­cia negativa en la cla­si­fi­ca­ción en los bu­s­ca­do­res. En co­n­se­cue­n­cia, los de­sa­rro­lla­do­res web tienen mucho interés en evitar páginas de error de este tipo.

Comodines de routes.php De­s­cri­p­ción
:num Actúa de comodín para números enteros
:any Actúa de comodín para una cadena de ca­ra­c­te­res (string)

El siguiente ejemplo ilustra una entrada en el routes.php que permite eliminar la función (article) del URL:

$route['news/article/(:num)'] = 'news/$1';

Gracias al comodín :num se se­le­c­cio­na el parámetro de una dirección dinámica y se almacena en la variable $1. Siempre y cuando se definan reglas de en­ru­ta­mie­n­to con :num o :any, estas se tienen que cerrar con pa­ré­n­te­sis.

El routes.php también acepta, por otro lado, reglas de en­ru­ta­mie­n­to como ex­pre­sio­nes regulares. Estos dos tipos de comodín se pueden escribir entonces de esta manera:

:num equivale a \d+
:any equivale a [^/]+

Así, una forma al­te­r­na­ti­va de escribir la dirección de arriba sería esta:

$route['news/article/(\d+ )'] = 'news/$1';

También las ex­pre­sio­nes regulares se escriben en el routes.php entre pa­ré­n­te­sis.

El flujo de apli­ca­ción en Co­deI­g­ni­ter: síntesis final

La siguiente ilu­s­tra­ción resume el flujo de apli­ca­ción de una apli­ca­ción basada en Co­deI­g­ni­ter en siete pasos:

Y ahora, paso a paso:

1. El archivo index.php sirve a Co­deI­g­ni­ter como primer co­n­tro­la­dor de las so­li­ci­tu­des HTTP entrantes. Es en este punto donde se ini­cia­li­zan todos los recursos básicos ne­ce­sa­rios para ejecutar la apli­ca­ción.

2. En el en­ru­ta­mie­n­to, Co­deI­g­ni­ter comprueba qué acción se debe ejecutar. Para ello, la apli­ca­ción compara la dirección de la solicitud con las reglas de en­ru­ta­mie­n­to co­m­pre­n­di­das en el routes.php.

3. Al en­ru­ta­mie­n­to le sigue el caching. Si en la memoria caché se encuentra una respuesta adecuada a la petición, esta se envía di­re­c­ta­me­n­te al navegador que la ha realizado. En caso contrario, se ejecuta el co­n­tro­la­dor indicado durante el en­ru­ta­mie­n­to tras activar la función de filtrado.

4. Co­deI­g­ni­ter contiene un filtro integrado que capta pe­ti­cio­nes ma­li­cio­sas. Antes de que la apli­ca­ción cargue un co­n­tro­la­dor ajustado a la solicitud, cada petición HTTP se somete a una prueba de seguridad.

5. Si la petición supera el filtrado se ejecuta el co­n­tro­la­dor. Este se­le­c­cio­na la vista adecuada y carga el modelo, así como todas las librerías, clases helfer, plugins y scripts ne­ce­sa­rios para poder responder la petición.

6. Tan pronto la vista ha recibido todos los datos re­le­va­n­tes, puede en­tre­gar­los al navegador.

7. Si se ha activado el cacheo, Co­deI­g­ni­ter conserva te­m­po­ra­l­me­n­te los datos salientes para responder pe­ti­cio­nes re­pe­ti­ti­vas di­re­c­ta­me­n­te.

Ventajas de utilizar Co­deI­g­ni­ter

Con más de 14.000 estrellas en GitHub, Co­deI­g­ni­ter es un proyecto de de­sa­rro­llo con una repu­tación re­ma­r­ca­ble, situado en el tercer puesto de los fra­me­wo­r­ks de PHP más populares. Sin embargo, como cualquier software, Co­deI­g­ni­ter tiene tanto ventajas como in­co­n­ve­nie­n­tes que han de co­n­si­de­rar­se antes de decidirse por él.

Estas son las ventajas de Co­deI­g­ni­ter:

  • Co­n­fi­gu­ra­ción de escasa di­fi­cu­l­tad: es fácil empezar a trabajar con Co­deI­g­ni­ter. Sus usuarios no necesitan demorarse ex­ce­si­va­me­n­te en la co­n­fi­gu­ra­ción del framework, sino que, casi in­me­dia­ta­me­n­te después de in­s­ta­lar­lo, pueden empezar con el de­sa­rro­llo de la apli­ca­ción. Los ajustes se reducen ese­n­cia­l­me­n­te al documento config.php en el di­re­c­to­rio ap­pli­ca­tion/config/. Aquí, los usuarios del framework definen una ruta estándar para el acceso desde el navegador, una clave para el cifrado, un nombre para la cookie de sesión y los ajustes para el Cross-Site-Scripting (XSS). Sería oportuno también crear un archivo .htaccess para poder eliminar el index.php de la dirección de la apli­ca­ción con Re­w­ri­te­Ru­le, así como es necesario co­n­fi­gu­rar la conexión con la base de datos que se introduce en el archivo database.php.
  • Small Footprint: Co­deI­g­ni­ter deja una huella muy pequeña en el sistema, pues el paquete de descarga del framework solo alcanza los 11 MB, con 9 MB ocupados úni­ca­me­n­te en la detallada do­cu­me­n­ta­ción del software. El motivo del reducido tamaño del código radica en que el sistema básico del framework solo incluye un par de bi­blio­te­cas. Todos los recursos adi­cio­na­les ne­ce­sa­rios se pueden instalar a po­s­te­rio­ri.
  • Re­n­di­mie­n­to ex­ce­p­cio­nal: esta es­tru­c­tu­ra básica tan simple lleva a Co­deI­g­ni­ter a superar a otros fra­me­wo­r­ks PHP en velocidad, algo ya alabado en su momento por el inventor de PHP Rasmus Lerdorf, entre otros. Lerdorf so­r­pre­n­dió en 2008 a propios y extraños de­cla­ra­n­do, en la Free and Open Source co­n­fe­re­n­ce (FrOSCon), que Co­deI­g­ni­ter le gustaba por ser “más rápido, más ligero y menos parecido a un framework” (“because it is faster, lighter and the least like a framework“”. En lugar de im­ple­me­n­tar el acceso a las páginas dinámicas mediante Query Strings como hacen otros fra­me­wo­r­ks PHP, Co­deI­g­ni­ter se inclina por un principio basado en segmentos:
  • URL limpios: Co­deI­g­ni­ter genera au­to­má­ti­ca­me­n­te di­re­c­cio­nes legibles para hombres y máquinas. En lugar de im­ple­me­n­tar el acceso a las páginas dinámicas mediante Query Strings como hacen otros fra­me­wo­r­ks PHP, Co­deI­g­ni­ter se inclina por un principio basado en segmentos:

URL con Query String: example.com?co­n­tro­ller=news&function=article&id=511

URL en segmentos: example.com/news/article/511

  • Estilo de pro­gra­ma­ción libre: el framework PHP se basa en una in­te­r­pre­ta­ción libre de la ar­qui­te­c­tu­ra MVC, lo que tiene como co­n­se­cue­n­cia que los de­sa­rro­lla­do­res sean libres en cuanto al estilo de pro­gra­ma­ción que quieran utilizar.
  • Do­cu­me­n­ta­ción amplia y detallada: Co­deI­g­ni­ter pone a di­s­po­si­ción de sus usuarios una completa do­cu­me­n­ta­ción en inglés, in­clu­ye­n­do un manual para pri­n­ci­pia­n­tes, di­s­po­ni­ble como guía online y versión para descarga en la página web del proyecto. Su código fuente es, además, claro y está bien comentado.
  • Comunidad de soporte: cualquier de­sa­rro­lla­dor que utilice Co­deI­g­ni­ter para programar apli­ca­cio­nes cuenta con el apoyo de otros usuarios, pues el proyecto está aco­m­pa­ña­do de una comunidad muy activa que incluye un foro público. Ac­tua­l­me­n­te, más de 8.143 miembros pa­r­ti­ci­pan en unos 65.000 hilos en los que in­te­r­ca­m­bian co­me­n­ta­rios y opiniones sobre el uso y el ulterior de­sa­rro­llo del framework.

De­s­ve­n­ta­jas de Co­de­l­g­ni­ter

Debido a la ad­qui­si­ción de BCIT, el de­sa­rro­llo del framework se estancó te­m­po­ra­l­me­n­te y, así, los intentos de los de­sa­rro­lla­do­res de im­ple­me­n­tar avances te­c­no­ló­gi­cos en Co­de­l­g­ni­ter han sido en vano. 

  • ORM solo a través de terceros: el mapeo objeto-re­la­cio­nal (object re­la­tio­nal mapping, ORM) se refiere a una técnica de de­sa­rro­llo de software que permite a las apli­ca­cio­nes almacenar objetos escritos en un lenguaje de pro­gra­ma­ción orientado a objetos como PHP en una base de datos re­la­cio­nal. Co­de­l­g­ni­ter no soporta al ORM de forma nativa. Sin embargo, esta te­c­no­lo­gía puede in­te­grar­se.
  • No cuenta con un motor de pla­n­ti­llas: Co­de­l­g­ni­ter se eno­r­gu­lle­ce de funcionar co­rre­c­ta­me­n­te sin un motor de pla­n­ti­llas. A cambio, este framework ofrece un ana­li­za­dor simple de pla­n­ti­llas. Eso puede ser visto como una ventaja, pues, ge­ne­ra­l­me­n­te, el uso de un motor de pla­n­ti­llas se asocia a una so­bre­ca­r­ga de re­n­di­mie­n­to (por encima del tiempo de ejecución). Además, también tendría que apre­n­de­r­se el lenguaje de la plantilla. Por otro lado, un motor de pla­n­ti­llas permite separar la ge­ne­ra­ción de datos del código para la pre­se­n­ta­ción, generando así un código fuente cla­ra­me­n­te es­tru­c­tu­ra­do. Si se utiliza un motor de pla­n­ti­llas con una sintaxis más ligera, se puede reducir si­g­ni­fi­ca­ti­va­me­n­te el tamaño total del código de la apli­ca­ción. 
  • No existen los espacios de nombres: con los espacios de nombres, PHP ofrece la capacidad de separar el código de los di­fe­re­n­tes grupos de apli­ca­cio­nes. Los de­sa­rro­lla­do­res de PHP hacen uso de esta ca­ra­c­te­rí­s­ti­ca para evitar los co­n­fli­c­tos que se producen durante la de­no­mi­na­ción de las clases y de las funciones, siendo, por ejemplo, muy comunes las co­li­sio­nes de nombre con clases internas de PHP con funciones, co­n­s­ta­n­tes o elementos in­te­gra­dos por terceros. Hasta ahora, Co­de­l­g­ni­ter no utiliza esta función PHP.  
  • No cuenta con la opción de autocarga de clases de PHP: con __autoload() y spl_autoload_register(), desde su quinta versión, PHP cuenta con dos funciones que permiten cargar las de­fi­ni­cio­nes de clase au­to­má­ti­ca­me­n­te cuando sea necesario. Esta función no está di­s­po­ni­ble en Co­de­l­g­ni­ter. 
  • Menos bi­blio­te­cas in­co­r­po­ra­das que otros entornos PHP: gracias al diseño ligero del software, la co­n­fi­gu­ra­ción inicial de Co­de­l­g­ni­ter pro­po­r­cio­na un número si­g­ni­fi­ca­ti­va­me­n­te menor de bi­blio­te­cas que otros fra­me­wo­r­ks PHP. En primer lugar, estos incluyen las tareas más im­po­r­ta­n­tes de de­sa­rro­llo web, como el acceso a la base de datos, envío de correo ele­c­tró­ni­co, va­li­da­ción de datos de fo­r­mu­la­rio, ma­n­te­ni­mie­n­to de las sesiones de trabajo o del trabajo con XML – RPC. Para aquellas tareas que van más allá de las funciones básicas, será necesario integrar otras bi­blio­te­cas o recursos externos. Ahora bien, esto puede resultar ventajoso para aquellos de­sa­rro­lla­do­res que están buscando un framework cuyas funciones se reduzcan al mínimo.

Co­de­l­g­ni­ter para los lectores con prisa

La siguiente tabla resume los puntos clave de este framework:

Co­deI­g­ni­ter
De­sa­rro­lla­dor British Columbia Institute of Te­ch­no­lo­gy (BCIT)
Última versión Versión 3.1.2
Patrón de diseño MVC/HMVC, Active Record, Chain of Re­s­po­n­si­bi­li­ty
Co­no­ci­mie­n­tos re­que­ri­dos PHP, pro­gra­ma­ción orientada a objetos (OOP)
Lenguaje de pro­gra­ma­ción PHP 5.6 en adelante
Licencia MIT-Lizenz
Soporte de base de datos MySQL (5.1+), Oracle, Po­s­t­gre­S­QL, MS SQL, SQLite, CUBRID, Interbase/Firebird, ODBC
ORM Solo a través de terceros
Caching Sí
Motor de pla­n­ti­llas No
Espacios de nombres No
Autocarga en PHP No
URL amigables para bu­s­ca­do­res No
Ca­ra­c­te­rí­s­ti­cas de seguridad Cross Site Request Forgery (XSRF), Cross Site Scripting (XSS), SQL Injection
Bi­blio­te­ca de pruebas PHP Unit

En co­n­clu­sión: ¿a qué proyectos está dirigido Co­de­l­g­ni­ter?

Con su diseño compacto y sintaxis amigable para los pri­n­ci­pia­n­tes, Co­de­l­g­ni­ter resulta apropiado para quienes aspiren a co­n­ve­r­ti­r­se en pro­gra­ma­do­res. Ahora bien, quienes ya hayan dado sus primeros pasos en el de­sa­rro­llo web dinámico basado en PHP, también se fa­mi­lia­ri­za­rán rá­pi­da­me­n­te con este ligero framework. Incluso los de­sa­rro­lla­do­res ex­pe­ri­me­n­ta­dos se toparán con una gran fle­xi­bi­li­dad, ga­ra­n­ti­za­da pri­n­ci­pa­l­me­n­te gracias a la práctica fu­n­cio­na­li­dad reducida de este framework PHP. Sin embargo, quien quiera trabajar con Co­de­l­g­ni­ter deberá aco­s­tu­m­brar­se al patrón MVC, así como pre­s­ci­n­dir de un motor de pla­n­ti­llas y de un ORM nativo. A pesar del reducido tamaño de su código, Co­de­l­g­ni­ter es una solución ideal para pequeños y grandes proyectos web por igual.

Ir al menú principal