Si quieres suscribirte al feed RSS del blog, este es el canal por defecto: http://www.nohaycuchara.com/feed/
Hola, Señor Thompson

CodeIgniter, un framework a tener en cuenta

12/01/2009

CodeIgniterA todo cerdo le llega su San Martín, y a todo programador un gran momento: la elección de un correcto entorno de trabajo. Y hasta hace poco no sabía de su existencia más que el nombre, pero poco a poco el framework CodeIgniter (PHP) está ganando puntos para convertirse en el mío (luchando duramente con RoR, a decir verdad).

No se me da muy bien escribir, así que creo que lo mejor será enumerar alguno de sus puntos fuertes:

Sistema de plantillas integrado

No es necesario tirar de Smarty o similares. Además, es mejor que este en el sentido de que es más limpio, no es necesario escribir mucho código extra (como iteraciones y funciones auxiliares, por ejemplo).
Una de sus bazas es la generación de bucles.

Pero bueno, como dice el refrán, una ristra de código vale más que mil palabras (o algo así ;) ):

Controlador:

  1. $this->load->library('parser');
  2. $textos = array(
  3.  'titulo_pagina'   => 'Título de página',
  4.  'titulo_seccion'   => 'Título de sección',
  5.  'productos' => array(
  6.   array('nombre' => 'Producto 1', 'descripcion' => 'Descripción 1.'),
  7.   array('nombre' => 'Producto 2', 'descripcion' => 'Descripción 2')
  8.  )
  9. );
  10. $this->parser->parse('template', $textos);

Vista:

  1. <html>
  2. <head>
  3. <title>{titulo_pagina}</title>
  4. </head>
  5. <body>
  6.  <h1>{titulo_seccion}</h1>
  7.  {productos}
  8.   <h2>{titulo}</h2>
  9.   <p>{descripcion}</p>
  10.  {/productos}
  11. </body>
  12. </html>

Como se puede ver, el loop se hace envolviendo el código HTML con su key en el array. Más fácil imposible.

Active Record

Todas las transacciones con del modelo de la aplicación son efectuadas de acuerdo a este modelo de datos. Mediante el mismo, disponemos de métodos como “find” o “save”, que agilizan muchísimo la ejecución de operaciones CRUD.

No quiero profundizar más en este concepto, pero os dejo un par de enlaces por si os pica el gusanillo:

Helpers

En CI hay gran cantidad de asistentes. Gran culpa de su rapidez la tiene la poca carga inicial del mismo, por lo que los helpers deben ser cargados según se necesiten. Una vez hecho esto, estarán disponibles globalmente para toda la aplicación.

A diferencia de otros sistemas, no están escritos en formato OOP, sino que son simples funciones de procedimiento. Esto, que podría parecer una desventaja, es todo lo contrario, ya que de esta manera se consigue una gran independencia de procesos, pudiendo cargar uno u otro sin tener en cuenta otras consideraciones.

Además, dichos asistentes son fácilmente ampliables y modificables creando otra clase que “extienda” la anterior (en la carpeta “application/helpers/”).

Hooks

Si necesitásemos modificar el proceso de ejecución por alguna razón (iniciando clases antes de que cargue el controlador, por ejemplo), hay disponible una característica llamada “hooks” o “ganchos” (lo que en algunos CMS -como WordPress- se llaman “hacks”).

Se trata simplemente de un archivo en la carpeta de configuración de la aplicación que define qué queremos hacer y en qué punto se hará, evitando que tengamos que modificar los archivos del núcleo para agregar nuevas funcionalidades.

Sparks

Como casi todos los frameworks, CI tiene un sistema de caché bastante depurado que hace que el tiempo de carga de las páginas disminuya considerablemente (acercándose al que tendría una web estática).

No obstante, carece de una característica casi imprescindible: la capacidad de discernir entre el contenido cacheable y el que no lo es. Para subsanar esto, existe una librería independiente llamada Sparks.

Benchmarking

Para la fase de optimización y debugging tenemos la Profiler Class, que se encarga de efectuar tests de rendimiento en diferentes áreas:

  • Uso de la memoria.
  • Carga de clases.
  • Tiempos de ejecución (total y de controladores).
  • Datos de URL.
  • Datos de REQUEST (concretamente, GET y POST).
  • Información de conexión con la BBDD.

Esta clase no necesita ser inicializada, ya que se carga por defecto. Para ver sus resultados al final de cada página, basta con poner “$this->output->enable_profiler(TRUE);” en el controlador.

Como es lógico, y al poder influir el entorno de ejecución en sus resultados, esta característica no es tenida en cuenta por el sistema de caché.

Un kernel, varios proyectos

En producción es muy raro que varias aplicaciones relacionadas necesiten diferentes configuraciones de CodeIgniter, por lo que se soporta la compartición del core para varios proyectos.

Para hacer uso de esto, simplemente debemos crear una carpeta por cada aplicación en “application/“, estableciendo después el app-root en el index.php de la siguiente manera “$application_folder = ‘application/[nombre-de-la-carpeta]‘;“.

Seguridad

Además de ser uno de los frameworks más rápidos que existen, también puede presumir de ser bastante seguro. Esto lo consigue gracias a los siguientes puntos:

  • Limitaciones en URI: Para evitar que datos maliciosos puedan llegar a su aplicación, sólo se permiten ciertos caracteres en la dirección de la misma (alfanuméricos, guión, guión bajo, punto, dos puntos y virgulilla –”~”-).
  • Objeto REQUEST: Los datos por GET son anulados, ya que el sistema utiliza segmentos URI en vez de las tradicionales Query strings por URL (si no se especifica lo contrario).
  • Magic Quotes: La directiva “magic_quotes_runtime” se setea en FALSE por defecto.
  • Filtro XSS: Dispone de una clase de validación que nos ayuda a filtrar los datos enviados. Gracias a ello, evitamos el Cross Site Scripting.

Comunidad y soporte

De largo, la parte más importante de esta lista. Un buen framework no es tal si no está bien documentado. Su función es facilitarle la vida al desarrollador que lo utiliza, por lo que hay que describir con todo lujo de detalles las funcionalidades que tiene disponibles.

En esto CodeIgniter me atrevería a decir que es el mejor. No sólo tiene una extensa documentación oficial en varios formatos e idiomas, sino que hay multitud de blogs, wikis y comunidades alternativas dedicadas a este gran proyecto.

Si necesitas algo que no incluye por defecto, probablemente alguien ya se ha preocupado de programarlo (es el caso de Sparks :) ). Toda una ventaja de cara al cálculo de los timmings.

Comentarios (6):

  • Por Dana el 12/01/2009 a las 22:24:
    #1

    Justo lo q te estabams comentado el otro dia…lo unico q yo discrepo un poko con el tema de ls Benchmarking pero weno…jajajajajaja no e entendido ni papa pero ta kedao chulo =) di SI a MALLORCA ( mensaje sutil…jujuju) :)

  • Por bombadil el 13/01/2009 a las 10:41:
    #2

    Mmmmm… después de esto, se tiene que poner muy bien el comentario sobre Ruby on Rails como para decantarse por él :-P

    Me ha gustado el artículo… a ver si revisas para tener un estilo de código más "limpio", en esta página no se ve muy bien… o será de mi Safari… :-S

  • Por nhc el 14/01/2009 a las 01:36:
    #3

    Bueno, pues no sé si te habrá convencido más, pero ya tienes el artículo de Rails. ≈cool≈

    Sobre lo del código… a ver si saco un par de minutos y le instalo algún plugin que me coloree la sintaxis y demás, que al principio no sabía a qué te referías.
    De todas maneras, gracias. :) Siempre está bien recibir sugerencias, jeje.

  • Por nhc el 16/01/2009 a las 00:54:
    #4

    Así queda bastante mejor el código, ¿eh, bombadil? :D

    http://wordpress.org/extend/plugins/wp-syntax/

  • Por bombadil el 16/01/2009 a las 09:36:
    #5

    Ahora sí, ahora se ve perfecto :-)

  • Por nhc el 22/01/2009 a las 00:10:
    #6

    Al final he cambiado de plugin, ya explicaré porqué. o_O

Di algo:

Smilies: ≈up≈ ≈puaj≈ ≈pirate≈ ≈oops≈ ≈muak≈ ≈mad≈ ≈love≈ ≈holy≈ ≈happy≈ ≈green≈ ≈down≈ ≈cry≈ ≈cool≈ ≈bff≈ ≈bad≈ ≈!≈ o_O O_O >< ;) :P :D :?: :-| :-? :) :( 8-O
Notas:
  • *: Campo requerido.
  • HTML desactivado.