Introducción a MVC con PHP y CodeIgniter

PiradoIV

Si alguna vez te has preguntado lo que es el patrón de programación diseño MVC y nunca te has atrevido a preguntarlo, aquí tienes una aportación que te va a abrir un mundo de nuevas posibilidades.

¿Qué es MVC y por qué lo adorarás?

MVC, Modelo-Vista-Controlador es un método con el que separarás la lógica del programa, el diseño de la aplicación y de los cálculos que tengas que hacer. Entre las numerosas ventajas que te ofrece, la principal con la que te vas a encontrar es la facilidad de coger tu código dentro de unos cuantos meses, ver por dónde lo dejaste y hacerlo crecer sin complicarte la vida. Como cualquier otro patrón de diseño, únicamente es útil si sigues el estilo que debes usar.

CodeIgniter

Hay numerosos Frameworks MVC en el mercado, yo he elegido CodeIgniter por su rapidez, su licencia y, sobre todo, la facilidad de aprender con él, su documentación es simplemente genial.

A parte del núcleo MVC, CodeIgniter viene con muchísimos módulos que nos ayudarán a no tener que reescribir los fragmentos de código más comunes. Hay bibliotecas que permiten, desde manejar la base de datos mediante ActiveRecord, hasta generar thumbnails de las imágenes que suben tus usuarios (también hay bibliotecas para controlar la subida de ficheros al servidor).

Es fácilmente ampliable, el Framework en sí está predispuesto a que crees tus propias bibliotecas para reutilizarlas en tus futuros proyectos. Como puedes ver, la idea final es escribir menos código, en la medida de lo posible.

Instalación

Requisitos previos:

· Servidor web con PHP 4.3.2 o superior (aunque en este tutorial y los futuros usaré PHP 5)
· Si vas a usar una base de datos, también te va a hacer falta que esté funcionando ;)
· Necesitarás algún programa para descomprimir el paquete de CodeIgniter (zip)
· Editor de textos, un IDE de programación o lo que uses para programar en PHP (yo uso TextMate, para Mac)

Instalación:

1.- Descarga la última versión de CodeIgniter.
2.- Descomprime el fichero en el directorio del servidor web que quieras crear tu aplicación.
3.- Renombra el directorio al nombre de tu proyecto ( yo voy a poner "holamundo" )
4.- En este momento ya puedes acceder a tu aplicación desde el navegador, verás algo así:

5.- Edita el fichero system/application/config/config.php y edita la variable

$config['base_url']

[/b]

Ahí deberás escribir la ruta al raíz de tu aplicación, en mi caso sería http://localhost/holamundo/

Eso será suficiente para seguir este tutorial =)

Controladores

Todo los cálculos que tiene que hacer tu aplicación, los procesan los controladores. En CodeIgniter, las URL de CodeIgniter funcionan así:

http://localhost/holamundo/index.php/[controlador]/[método]/[parametro1]/[parametro2]/...

Por poner un ejemplo:
http://localhost/holamundo/index.php/usuario/mostrar/1/

Estaríamos llamando al controlador usuario, usando el método mostrar y pasándole 1 al primer parámetro que recibe. El código para este controlador sería el siguiente:

<?php if (! defined('BASEPATH')) exit('No direct script access');

class Usuario extends Controller {

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

function mostrar($id = null) {
    // Código de este método
    echo $id;
}

}

Tendríamos que guardar este fichero en system/application/controllers/usuario.php.

Vistas

En lugar de mezclar la parte del diseño con la lógica del programa (con todos los problemas que te puede ocasionar esto), creamos plantillas a las que le pasamos los datos ya procesados. Vamos a crear la plantilla para nuestro ejemplo:

<html>
<head>
<title>Mostrando al usuario <?= $id ?></title>
</head>
<body>
    <h1><?= $id ?></h1>
</body>
</html>

Guardaríamos este fichero en system/application/views/usuario_mostrar.php (le podemos dar el nombre que queramos. Ahora en el controlador (controllers/usuario.php) vamos a llamar a esta vista, así que lo editamos, voy a pegar la porción del código:

function mostrar($id = null) {
    $data['id'] = $id;
    $this->load->view('usuario_mostrar', $data);
}

Como puedes ver, basta con preparar un array con los datos y pasárselos a la vista, usando la función que proporciona CodeIgniter.

Todo esto tiene como consecuencia que será muchísimo más sencillo en un equipo de trabajadores que uno se encargue del diseño, sin destrozar la lógica de la aplicación y viceversa.

Truco: ¿Por qué no pruebas a hacer un par de vistas cabecera.php y pie.php, podrás llamarlas así, por ejemplo:

$this->load->view('cabecera');
$this->load->view('usuario_mostrar', $data);
$this->load->view('pie');

Modelos

Ya tenemos el controlador y la vista, todo esto está muy bien en páginas estáticas, pero vamos a trastear un poco con los modelos, en este caso vamos a seguir con los usuarios... manos a la obra, crea el fichero system/application/models/usuario_model.php con este código:

<?php if (! defined('BASEPATH')) exit('No direct script access');

class Usuario_model extends Model {

function __construct() {
	
    parent::Model();
	
    $id = null;
    $nombre = null;
    $apellidos = null;
    $email = null;
	
}

}

Vamos a modificar también un poco el controlador:

function mostrar($id = null) {

// Cargamos el modelo
$this->load->model('usuario_model');

// ... y creamos una nueva instancia
$u = new $this->usuario_model;

// Le asignamos unos cuantos atributos
$u->id = $id;
$u->nombre = 'Pepito';
$u->apellidos = 'de Los Palotes';

// Y se lo pasamos directamente a la vista
$this->load->view('usuario_mostrar', $u);

}

¿Qué más cosas puedo hacer?

Teniendo estos conceptos básicos claros, puedes profundizar en cosas algo más avanzadas como:

· Eliminar el index.php de todas tus URLs
· Crear bucles dentro de tus vistas, por ejemplo, mostrar 5 usuarios en una tabla
· Guardar las instancias de tus modelos en la base de datos
· Hacer un modelo "ListaUsuarios" que te saque un listado de usuarios de la base de datos
· Añadirle métodos a los modelos
· Etc

Pero todas estas cosillas las iré subiendo a parte, lo que me interesa con este tutorial es que conozcas lo más básico del patrón MVC.

Bibliografía y contacto

· Wikipedia
· CodeIgniter.com ( User Guide )
· ReWork, 37signals
· #mv.nerd @ Quakenet y #mvnerds @ Twitter

15
BLZKZ

fuck yeah! al fin :P

Aunque todo esto ya lo sabía tenía curiosidad por si se me pasaba algo y aprender mas :3

PD: mola

B

Ya era hora de un hilo sobre frameworks en php. Aunque yo terminé con Zend Framework básicamente porque lo hacen los de php.

DarkSoldier

creo que te quiero :) #mvnerds 4 ever !

CricK

Yo lo utilicé para un pequeño proyecto y está genial, en una tarde sin saber ni siquiera php(sabiendo programar claro en otros lenguajes) ya puedes estar haciendo cosas relativamente complejas de forma muy rápida. Todo gracias especialmente a la fabulosa documentación, no especialmente extensa pero muy clara, en la linea de la filosofía del proyecto.

NeB1

Yo al final dejé de usar frameworks, llamadme raro :S (usaba cake)

#7 en eso si que tienes toda la razón del mundo

PiradoIV

Creo que se me olvidó también comentar que, en un grupo de trabajo, si dos personas ya han usado este Framework, directamente sabrán por dónde tienen que empezar, en lugar de aprender cómo funciona el motor que te has construído tú mismo... y si no lo conocen, estoy seguro que la documentación va a ser mejor que la que le puedas dar tú x'D

1 respuesta
P

Teniendo en cuenta de que PHP 5 soporta la programación a objetos más o menos decentemente y que PHP 6 va a traerlo de forma nativa, que code Igniter continúe anclado en php 4 me da un palo impresionante para ponerme a utilizarlo.

Symfony es otro gran framework, supongo que el mejor para programadores web con php, que sí viene preparado para la programación de objetos. Está programado para PHP 5.2, y actualmente va por la versión 1.4, aunque se está desarrollando la 2.0 echa íntegra en PHP 6.0.
Cuesta bastante empezar a programar con symfony, pero cuando cojes soltura, el ahorro de trabajo a la hora de crear las mismas chorradas de siempre es impagable.
Symfony crea los formularios para insercción modificación y eliminación en las tablas de tu BD (y si quieres, por AJAX), incluso las comprobaciones de javascript de que los datos sean correctos, el tema del sistema de logeo del sitio, la internacionalización y culturización, el tema de la seguridad, el mod_rewrite, etc, de forma automática.
Al igual que Code Igniter, utiliza el patrón de diseño MVC.

MUY recomendable.

1
BLZKZ

#8 Symfony crea los formularios para insercción modificación y eliminación en las tablas de tu BD

Codeingniter tamiben, y lo del mod_rewrite lo mismo.

PHP 4 ya soporta OO y aun asi, puedes usar CI con php5 sin hacer nada que baje de ahi.

Foxandxss

Yo soy más de la competencia.

Cuando se van a dignar a poner php 6 como estable? (Imagino que habrán builds por ahí pues libros de php 6 si que hay).

Algún día me animaré a aprender PHP aunque imagino que tiraré de symphony o Zend.

Kartalon

Llevo casi todo el día estudiando patrones de diseño (que no de programación, esa terminología pirado...) y odio MVC, DAO, y la puta madre que parió a todos los patrones.

He dicho.

Khanser

#11 si precisamente MVC y DAO son de los más faciles...

1
Kartalon

#12 Lo son (y por eso los dos únicos que he nombrado, porque son los dos únicos que me se bien junto con el puentecillo y la fábrica y poco más y mañana tengo el examen :coolface: ), y aun así los sigo odiando.

PiradoIV

Yep, por supuesto a todo lo que dicen por arriba, pero la introducción es a MVC en CodeIgniter, luego que cada uno luego use el Framework que quiera. La razón de usar CI para este tuturial es que tiene cero configuración (descomprimir y empezar a desarrollar). El hilo no es un AK o Colt sobre cuál es el mejor de toda la oferta de Frameworks.

En este sentido, CodeIgniter 2 dejará de darle soporte a PHP4 (v5.1.6 como mínimo), pero sé de buena tinta que tenemos entre nosotros fans totales de Symfony, Cake y ZF, cada uno con sus motivos. De lo que se trata luego es que estemos a gusto y cumplamos con nuestros tiempos de entrega =)

#11 Kartalon, soy autodidacta, no me pidas más en ese sentido xD

DarkSoldier

es fácil y hechandole morro.... por que no haceis algo parecido con los demas frameworks ?? :) asi los que no sabemos del tema leemos las posibilidades que tenemos ^^

trollface

Zeroner

http://djangopony.com/ Magic that can't be removed.

NeB1

#16 DJANGO the web framework for ponies with magical powers

XDDDD

KoRMuZ

Yo solo digo una cosa, cuidado con los / en las rutas. Ejem.

1 respuesta
MTX_Anubis

#11 Cómo puedes cagarte en la madre que parió a algo que precisamente te resuelve problemas de diseño! Y además, sobre todo, cuando entres en un proyecto nuevo, reconocerás rapidamente la estructura de este sin entrar en detalles de implementación

PiradoIV

Casualmente estuve trasteando con Python y Google App Engine y le metí algo de mano a Django... fantabuloso, no digo más xD

PD: El siguiente tutorial está de camino =)

DarkSoldier

que coño es django ??? xDD

B

#21 Tardas menos en ponerlo en google que preguntarlo en un foro. Es un framework para python

1
Zeroner

Para los curiosos de Django. Os recomiendo que echéis un ojo a http://www.box.net/shared/9qa2de069m

DarkSoldier

#22 y tu en poner algo interesante y relevante k flamear de esa manera :S. Gracias por la segunda parte.

DarkSoldier

+1 zeroner
+1 django :) weno la verdad.. increible, magia ! XD

7 días después
B

Cojonudo! Gracias.

1 mes después
DarkSoldier

#18 +1 macho XDDD que asco da eso !! xD

bLaKnI

Para mi, lo que dice #7 es lo único que puedo considerar como cierto y "real".
Todo lo demás, me parece complicarse la vida increíblemente.

Mirando las porciones de código de ejemplo en #1, casi imagino que hace cada una de las llamadas que se ven propias del framework...

No me gustan y no me gustaran nunca. Solo en aspectos muy contados y concretos. :\

B

Yo también renegaba de frameworks hasta que un dia me dio por probar uno. Probé Zend framewok básicamente porque era de los creadores de php y no dejarian tirado a nadie. Una vez que te acostumbras no vuelves a hacer las cosas a pelo, te ahorra mucho tiempo y poco a poco acabas comprendiendo la parte que no se ve del framework. Hoy mismo con dos lineas y un archivo tmx implementé un sitema multilenguaje que de hacerlo a pelo me hubiera llevado bastante mas.

4 meses después
BLZKZ

Llamadme tonto pero no consigo que me funcione mi propia libreria xD Me he leido la documentacion y lo hago tal como dice, pero al usarlo me suelta que porpocopaco existe eso que intento usar.

A ver si #1 o cualquier otro me puede echar un cable xD

PD: Deberias remarcar que los ficheros de los modelos deben llevar el nombre entero en minusculas, porque en local puede funcionar con mayus, en servidor te dice que gl xD

1 respuesta