viernes, 26 de noviembre de 2010

Experiencias en Code Igniter - Parte 1

Bueno luego de una ausencia muuuy prolongada he decidido contribuir al conocimiento general como todo el mundo.
No tengo mejor manera de arrancar esto sino con lo que más he usado los últimos 3 años como herramienta de trabajo.

The Code Igniter Framework




0. Nota


Esto esta enfocado a personas que por lo menos han trabajado con algún framework, no esta escrito para personas que recién arrancan en el mundo de éstos. 
 

1. Instalación




Vamos al sitio oficial de CodeIgniter (http://codeigniter.com/) y descargamos la última versión (al día de hoy 1.7.2) .
Descomprimimos el archivo y vemos que la estructura es:

/
. /system
. /index.php



Primero que nada, el index.php es el archivo de CodeIgniter (de aquí en más CI) que maneja todas las peticiones al framework. Dentro de la carpeta system tenemos un monton de carpetas, la única que debemos tener en cuenta es la carpeta "application".

Dentro de esta carpeta estarán todos los archivos específicos de nuestro proyecto. Por lo que actualizar el framework se torna sumamente sencillo.

Hemos de suponer que se tiene de un lugar donde alojar estos archivos, por ejemplo, un servidor con un dominio. En otro momento mostraré como se pueden crear un entorno de trabajo cómodo para trabajar varias personas sobre el mismo proyecto. Entonces, decía, supongamos que tenemos un dominio http://misitio.com/ y que el document root de nuestro hosting se llama "httpdocs".
Debemos tirar dentro de la carpeta pública (httpdocs) los archivos ta cual están en el .zip que nos bajamos del sitio de CI.

Para una instalación básica, solo debemos modificar el archivo:

/system/application/config/config.php
 

Donde dice: 


$config['base_url'] = "http://www.mysite.com/";


debemos especificar la dirección del sitio, ahora bien, muy a menudo sucede que el sitio puede cambiar de dirección (múltiples nombres o diferentes ámbitos), lo que yo aconsejo es dejar parametrizado este parámetro (redundancia :D ) 


$config['base_url'] = "http://".$_SERVER['HTTP_HOST']."/";


Así nos aseguramos de que no importa el dominio en el que se encuentre, siempre va a funcionar. 


Probemos la instalación haciendo http://misitio.com/ en el browser, deberíamos ver una página que diga "Welcome to Code Igniter!. Eso significa que que logramos instalar correctamente el framework Hasta aquí nada complicado ni nuevo. Ahora bien, comenzamos la parte donde "tuenamos" el CI para potenciarlo.


1. División MVC


La división MVC clásica nos dice que tenemos una capa Modelo, una capa Vista y una capa Controladora (en realidad sería Model View Controller). Esto es ya lo disponemos en nuestro CI.
  • /controller: carpeta de los controladores.
  • /model: carpeta de los modelos.
  • /views: carpeta de los archivos de vistas.
Bien, según esto, dentro de los archivos de "views" vamos a tener solamente HTML, CSS, JS, y muy poco de php (por lo general, los objetos de transporte de datos y búcles de iteración). En "controller" tenemos los controladores que son los métodos por los cuales accederemos a nuestras páginas, pero también son aquellos que leen datos del usuario y leen datos desde la DB.
¿Que tiene de bueno y de malo ésto?
  • Lo bueno: Hay una separación entre la vista y el modelo mediando por el controlador, este se encargará de trabajar los datos entre ambos extremos para poder presentarlos en cada uno de ellos de la manera correcta.
  • Lo malo: se torna complicado reutilizar código o modularizar componentes ya que depende mucho de como fue confeccionado el controlador. Es decir, puedo reutilizar un controlador que permita registrar o loguear a un usuario, pero ya es más difícil si mi controlador hiciera cosas más complejas o que dependan un poco más del proyecto en el que esté.

Ahora, ¿que pasa si a este modelo le agregáramos una capa más al MVC? llamémosla capa "business". Podríamos colocar aquí todo lo relativo al manejo grueso del negocio en la aplicación, haciendo que una clase sea la encargada exclusiva de solicitar datos al modelo y presentarlos como colección de objetos al controlador, para que éste opere con éstos como lo desee. También se encargaría de las acciones que impacten en el modelo, tomando los datos en "crudo" desde el controlador para que luego trabaje con ellos (validación, conversión, etc) y eventualmente realize la operación solicitada o notifique un error. También puede encargarse de tareas sobre archivos, enviar e-mails, etc. Todo aquello que pueda ser modularizado y realice tareas complejas (más allá de tareas de presentación de datos).



Resumiendo: Creamos una nueva capa llamada business donde concentra todo el negocio grueso de nuestra aplicación, impacto de datos en el modelo, validación de los datos, obtención de datos desde el modelo, envío de e-mails, etc, etc.


2. Transferencia de datos y Objetos


Como habrán visto, la transferencia de datos, sobre todo de parámetros en php puede llegar a ser compleja si no se tiene cuidado. Es por eso que el concepto que debemos asimilar es la de usar Data Transfer Objects (DTOs). Estos son objetos sencillos donde representarían la entidad que deseamos modelar. Estos objetos no son nada mas que clases vacías de implementación solo con los atributos.
Por ejemplo: Si tuviéramos que crear un DTO para la entidad "usuario" éste sería:


/**
 * 
 * User Data Transfer Object
 * @author isanchez
 * @version 1.0
 *
 */
class UserDTO {
 /**
  * 
  * User Identification
  * @var Int
  */
 public $userId = null;
 
 /**
  * 
  * User name
  * @var VARCHAR
  */
 public $name = null;
 
 /**
  * 
  * User E-mail
  * @var VARCHAR
  */
 public $email = null;
}

En este caso definimos la clase UserDTO con los atributos userId, name e email. si tuviéramos este objeto cargado en una variable el mismo se vería así:



$userDTO = new UserDTO();
$userDTO->userId = 123;
$userDTO->name = "Bill Gates";
$userDTO->email = "none@none.com";




Entonces cuando queremos pasarle los datos de creación de un usuario al business de usuario, solo deberíamos cargar los datos como lo hicimos anteriormente (sin el userId obviamente) y pasárselos a la función encargada, como por ejemplo:


$userDTO->userId = $userBusiness->create($userDTO);
if( $userDTO->userId > 0 ){
    echo "Usuario creado";
}else{
    echo "No se pudo crear el usuario";
}
Resumiendo: Usamos clases vacías como objetos para trasportar datos, tanto sea para pasarlo como parámetro entre los métodos de una clase como para usarlos a nivel de vista (podemos paras arrays de UserDTOs cuando queramos listar los usuarios de nuestra aplicación por ejemplo).


Bien hasta aquí mas o menos se logra tener instalada una copia de CI con la división MVC + la capa business. Más adelante escribiré en detalle sobre esta última capa y sobre las clases "base" que debemos tener para una mejor utilización de éste framework.

Acerca del mundo blogger

Buenas para el que este en este blog!!!
Antes que nada esto es simplemente una reflexión que carece de toda funcionalidad práctica.
Resulta que siguiendo recomendaciones de amigos sobre los beneficios de escribir blogs había comenzado este ya hace no se cuanto tiempo.
Uno de estos amigos me dijo que el lo veía mas bien como un instrumento para escribir "conocimiento adquirido" y que de esa manera, ejercitaba un poco más su dominio en el tema y que de última, le servía para mantener una especie de "manual" online de lo que ya sabía.

Es por eso, que hay algunos post míos sobre algoritmos y cosas del svn y bla bla bla....
Pero el mundo del trabajo es voraz y me ha alejado de este pequeño espacio.

Ahora bien, ¿a que viene este post? resulta que, como le había agregado analytics, estaba viendo que sin hacer prácticamente nada, sin agregar un post ni de casualidad durante años, este bendito sitio viene a tener más entradas que algunos otros que tengo jajajja es increíble como con 4 post "Bobos" se puede llegar a tantas entadas. :D

Bueno era eso solo, una simple micro reflexión, comentario, catarsis que quería hacer.
Muchas gracias a los 4 individuos que dejaron comentarios en los posts anteriores :D