Modelo - Vista - Controlador en CodeIgniter

  • Por
  • PHP
Explicamos la arquitectura de desarrollo llamada Modelo - Vista - Controlador, que utiliza CodeIgniter y otros frameworks PHP.
Seguimos ofreciendo capítulos introductorios en el Manual de CodeIgniter de DesarrolloWeb.com, en esta ocasión vamos a explicar estilo de programación que tenemos que seguir cuando desarrollemos nuestras aplicaciones web en CodeIgniter.

El Modelo, Vista, Controlador es típicamente utilizado para la creación de aplicaciones web y no sólo CodeIgniter lo implementa, sino también otra serie de frameworks de desarrollo web, en PHP u otros lenguajes. Es interesante porque separa en varios grupos las complejidades de las distintas partes que componen una página web, como la vista y la lógica, así como el acceso a la base de datos.

Quizás lo que más nos fuerce a cambiar nuestros hábitos de programación en PHP es el hecho de tener que basar nuestros scripts en este modelo de programación, que seguramente resultará novedoso para la mayoría de los lectores de este manual, porque fija un nuevo estilo de desarrollo de aplicaciones, que nos obliga a separar código fuente según su ámbito. Sin embargo, como decíamos anteriormente, estas nuevas costumbres de codificación también nos ayudarán a que nuestros programas sean mejores y disfruten de varias ventajas como ser más organizados, extendibles y entendibles por otros desarrolladores, reutilizables, con más fácil mantenimiento, etc.

Para los que no lo conocen, el Modelo - Vista - Controlador (en inglés Model - View - Controller) es un patrón de desarrollo o un estilo de arquitectura de software que separa el código fuente de las aplicaciones en tres grupos:

Modelo:
Todo el código que tiene que ver con el acceso a base de datos. En el modelo mantendremos encapsulada la complejidad de nuestra base de datos y simplemente crearemos funciones para recibir, insertar, actualizar o borrar información de nuestras tablas. Al mantenerse todas las llamadas a la base de datos en un mismo código, desde otras partes del programa podremos invocar las funciones que necesitemos del modelo y éste se encargará de procesarlas. En el modelo nos podrán preocupar cosas como el tipo de base de datos con la que trabajamos, o las tablas y sus relaciones, pero desde las otras partes del programa simplemente llamaremos a las funciones del modelo sin importarnos qué tiene que hace éste para conseguir realizar las acciones invocadas.

Vista:
La vista codifica y mantiene la presentación final de nuestra aplicación de cara al usuario. Es decir, en la vista colocaremos todo el código HTML, CSS, Javascript, etc. que se tiene que generar para producir la página tal cual queremos que la vea el usuario. En la práctica la vista no sólo sirve para producir páginas web, sino también cualquier otra salida que queramos enviar al usuario, en formatos o lenguajes distintos, como pueden ser feeds RSS, archivos JSON, XML, etc.

Controlador:
El controlador podríamos decir que es la parte más importante, porque hace de enlace entre el modelo, la vista y cualquier otro recurso que se tenga que procesar en el servidor para generar la página web. En resumen, en el controlador guardamos la lógica de nuestras páginas y realizamos todas las acciones que sean necesarias para generarlas, ayudados del modelo o la vista.

Nota: Esto quiere decir, en la práctica para el caso de CodeIgniter, que según sea el ámbito donde estemos codificando, tendremos que escribir las líneas de código de cualquier página web en tres grupos de archivos distintos. En una aplicación estándar podremos tener varios modelos (por ejemplo, para cada una de las entidades distintas de la base de datos), varias vistas (una o varias para cada página o sección) y varios controladores (para cada página o sección de la web). Luego veremos dónde tenemos que guardar los archivos de cada uno de estos tres grupos.
Durante el desarrollo con CodeIgniter será muy recomendable seguir las normas del diseño Modelo - Vista - Controlador (MVC), pero realmente el framework es bastante flexible y permite que, si lo deseamos, no sigamos el desarrollo atendiendo a dicha arquitectura. En este caso, podríamos tener simplemente controladores y dentro de ellos realizar todas las acciones de acceso a la base de datos directamente, sin hacer llamadas al modelo, o escribir texto en la salida sin utilizar las vistas. Obviamente, esta opción no aprovechará las ventajas de separación de código entre presentación, lógica y modelo de base de datos, pero si vemos que nos resulta muy complejo el MVC, podemos dejarlo de lado.

En el caso que no utilizemos los modelos, no ocurrirá ningún efecto negativo en el desempeño del framework, pero en el caso de las vistas, si no las utilizamos y escribimos salida directamente desde el controlador, como por ejemplo con sentencias echo de PHP en en código de los controladores, perderemos algunas de las ventajas que CodeIgniter realiza por nosotros para procesar la salida antes de enviarla al usuario. Esto lo detallaremos más adelante.

Nota: Como sabemos, o podremos imaginar, separar la vista o presentación de la lógica de los programas es una ventaja importante, ya que ayuda a mantener un código más sencillo, reducido y con mayor facilidad de mantenimiento. En principio puede parecer un tanto complejo el hecho de manejar varios archivos con códigos distintos, pero a medio plazo nos vendrá muy bien separar el código de cada parte de nuestra aplicación. Nos evitará muchos de los problemas que a veces tenemos en desarrollos PHP, donde en un mismo archivo tenemos mezclado código en varios lenguajes como HTML, CSS, SQL, con el propio código PHP para generar la lógica de nuestro negocio.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

eder

20/1/2010
separacion del modelo de la vista
¡Hola! bueno compañero gracias por la informacion es de mucha relevancia para mi, ok! en relacion a esto ya se que es posible separar la vista del controlador, pero en realidad mi duda es la siguiente.. quisiera saber si con este framework codeigniter es posible trabajar con el modelo y la vista de forma separadas?

mixamigo

17/3/2010
Facilidad de entendimiento
Un saludos a todos, es muy interesante este articulo, quiero que sea mas didáctico con imágenes y usando figuras simples explicar de una manera mas visual, con intensión de mejorar el entendimiento.

Distriker

19/3/2010
¡Me encanta el MVC!
Me encanta el MVC, así que no tendré problemas, aunque tengo que admitir que algunas veces he echo todo en un mismo archivo como para dar un ejemplo sencillo o para pequeñitas aplicaciones.

Saludos

pablo_cus

03/5/2010
Problemas con carga de modelos
Hola no se si sea el lugar indicado, pero tengo una consulta intento cargar un modelo de la siguiente forma desde un controlador
$this->load->model('Xx','','TRUE');
$aa= $this->Xx->prueba();

y me aparece el siguiente error

Message: Undefined property: Login::$Xx

siendo Login el nombre de mi controlador

Espero que alguien me pueda ayudar
Gracias

Victor

25/1/2012
Lo que no entiendo de mvc
Buenas? ando en búsqueda de un arquitecto de software por dudas muy fuerte con el patrón mvc y con protocolo se comunica.
Estoy en proceso de construcción de un sistema de control interno para una estación policial como un proyecto comunitario de universidad?
El cual tengo que documentar mediante artefacto, los cuales no estoy acostumbrado a realizar como es el caso del DAS; el punto es que la arquitectura que seleccione para este sistema es MVC, pero a la ves este sistema maneja periférico como capta huella y cámara que no sé cómo representar en la arquitectura ni en el código? sé que tengo que usar API?s para esto pero no sé cómo ponerlas o usarlas. Actual mente no estoy programando solo documentando pero si no paso esta parte creo que nunca llegare a programar jeje, lo más gracioso es que tengo que crear un diseño funcional de mi arquitectura c con mis vista mi protocolo de comunicación pero aún no sé qué protocolo usa mvc para que el controlador se comunique con la vista mi profesora dice que tiene que ver con el puerto 80 pero aun no lo capto

Obrac74

20/9/2012
problemas al pasar el array a la view
$this->load->model('catalogo_m');
$resultado=$this->catalogo_m->trae_todo();
$this->load->view('catalogo_v', $resultado);

Obtengo los datos del modelo pero el problema es que no me reconoce $resultado en catalogo_v, esto es no me despliega los datos esperados.

Diego

02/3/2015
MVC
Una acotación importante, en el MODELO es donde va la lógica de negocio, el controlador tiene la lógica de navegación de las páginas, el controlador, controla a la vista estas 2 van de la mano, es decir si un dia cambia la vista ejm usar otro componente web (jquery mobile, etc) el controlador tendria que acoplarse pero la logica de negocio (que reside en el MODELO, OJO MODELO SE LLAMA PORQUE ES EL MODELO DEL NEGOCIO, LA lógica de negocio va allí) no cambia, si la BD cambia, el modelo tampoco debería cambiar, esto es en sí la riqueza del MVC independizar todo, denle una ojeada a estas definiciones en las páginas de oracle.

David

08/12/2017
modelo-vista-controlador
Te felicito por este capitulo en particular, muy bien explicado claro, simple y preciso, por fin termine de entender el patron modelo-vista-controlador...jajaja.
Muchas gracias!! :-)