Ir al contenido principal

Ejemplo MVC en PHP

Implementación básica del patrón Modelo Vista Controlador (MVC) en PHP utilizando OOP.
MVC es un patrón de diseño que implementa tres capas con el objetivo de separar la interfaz de usuario, las reglas de negocio y el acceso a los datos. Aquellos que no tienen conocimiento de este patrón les recomiendo que lean brevemente de que se trata MVC y la programación orientada a objetos.
En esta implementación PHP las vistas manejan todo lo relacionado con la interfaz del usuario (html, css, javascript), el modelo proporciona el acceso a los datos (para facilitar este ejemplo se simula la conexión a una Base de Datos) y el controlador administra toda la lógica del negocio y es el nexo entre el modelo y la vista. Hay muchos frameworks que implementan MVC en PHP de forma muy efectiva y son muy populares. Este ejemplo está orientado a aquellos que quieran hacer su propio framework o que quieran conocer el funcionamiento paso a paso.
En este ejemplo se muestra una pantalla de bienvenida con un formulario de login y luego se simula el ingreso al sistema.



Para conocer mejor el funcionamiento hay que tener en cuenta algunas cosas, este ejemplo se basa en el paradigma de objetos y está desarrollado con OOP, por lo tanto generaremos clases para todas las vistas, controladores y modelos que se utilicen. Para ello hay 3 clases abstractas que son base para el funcionamiento y de las cuales heredan todas las utilizadas en la aplicación, estas son la clase Controlador, la clase Modelo y la clase Vista. En ellas se definen propiedades y métodos comunes que se utilizarán en las clases hijas. De estas tres heredarán las demás, en este ejemplo hay un controlador (ControladorPrincipal.php), un modelo (ModeloPrincipal.php) y dos vistas (Bienvenida.php y Inicio.php). Por otro lado hay que mencionar que en general se utiliza una estructura de directorios para organizar los archivos de forma clara muchos frameworks utilizan estructuras similares, en nuestro caso los archivos se distribuyen de la siguiente manera:


En el raíz se encuentra el archivo index.php que es el punto de entrada de la aplicación, todas las peticiones son direccionadas a este archivo, además está la carpeta app que contiene subcarpetas para ordenar los archivos de controladores, modelos, vistas y aquellos archivos que se incluyen en el código (clases base, archivo de constantes, etc). También se encuentra la carpeta web donde se guardan en subcarpetas los archivos que son propios del fron end, como html, css, imágenes o javascript.
Comencemos ahora con el funcionamiento, como se mencionó anteriormente el punto de entrada de al aplicación es el archivo index.php, todas las peticiones son enviadas a este archivo, se envía por post el el nombre del controlador que se debe instanciar y el nombre del método que hay que se va a ejecutar.
Archivo index.php:


Comenzamos incluyendo el archivo de constantes, en este caso solo hay un par de prueba. Luego se usa la función __autoload para cargar en el momento que se necesite los archivos de las clases, cuando querramos instanciar un objeto, si la clase correspondiente no está en memoria, __autoload incluirá el archivo donde está definida la clase y luego se continuará con la instancia del objeto. Lo recomendado es generar un archivo por cada clase, y que la clase tenga el mismo nombre del archivo, por ejemplo en el archivo Bienvenida.php solo se define la clase Bienvenida. De esta manera cada ejecución incluirá solo los archivos que necesite, optimizando el uso de los recursos del servidor. Recordemos que __autoload solo cargará el archivo en el momento que se necestite, hasta este momento solo están definidas las ubicaciones donde se buscarán los archivos.
la ejecución comienza obteniendo las variables post "controlador" y "metodo" que nos dirán que acción debemos ejecutar, si estas variables están vacías se asume que es el primer ingreso y se cargan los valores por defecto "ControladorPrincipal" y "bienvenida". Antes de ejecutar verificamos con la función is_callable que se pueda ejecutar, es decir que sea una clase y un método válidos. Si todo va bien se hace la instancia del controlador y se ejecuta el método en las últimas dos líneas del archivo. A partir de ahora continúa la ejecución de lo que tengamos definido en el método.
Imaginemos que es la primera vez que ingresamos al sitio, por lo tanto se instanciará un objeto de la clase ControladorPrincipal y se ejecutará el método bienvenida
Veamos ahora el método bienvenida, para ello analizaremos brevemente las clases ControladorPrincipal y Controlador.

ControladorPrincipal hereda de la clase abstracta Controlador.



En la clase Controlador solo se definió una propiedad con su correspondiente getter y setter, solo a efectos de implementar la clase en el ejemplo, aquí deberíamos agregar todo lo que sea común a nuestros controladores. ControladorPrincipal solo tiene dos métodos, bienvenida y login. En bienvenida se realiza una instancia de la vista (en este caso la clase Bienvenida) y se muestra al usuario, no se utiliza el modelo porque se asume que en el primer ingreso no se recupera nada de la base de datos.

Para ello se carga el template html (que ubicará todos los elementos de nuestro sitio) y se ejecuta el método mostrarHTML que enviará al navegador el contenido del template mezclado con los datos propios de nuestra vista. Veamos las clases Vista y Bienvenida para comprender mejor la ejecución:


En la clase vista se definen propiedades para guardar avisos o mensajes de error para mostrar al usuario, los datos propios de la ejecución y el template html. Lo principal es que se declara el método abstracto mostrarHTML obligando su implementación en todas las clases hijas.


En Bienvenida se implementa mostarHTML, vemos que genera un array llamado diccionario donde se cargarán todas las cosas que se mostrarán. Luego se incluyen estos elementos en el template html con un foreach y se muestra al usuario. Para incluir cada elemento en el template en su lugar se utilizan tags para reemplazar las cosas, por ejemplo el contenido del array diccionario en la ubicaión 'areaTrabajo' se ubicará en el templete html en el lugar que está {areadeTrabajo}. De esta forma se van agregando los contenidos en la vista, logrando que no haya elementos html en el controlador ni en el modelo, todo dato a mostrar se guarda en una propiedad de la clase vista, y en este método mostrarHTML es cuando se combinan los elementos. Es esencial mantener esta conducta para lograr un buen código, que separe los elementos y que quede lo más ordenado posible.
La pantalla de bienvenida muestra un formulario de login, en este ejemplo no hay conexión a base de datos por lo tanto se simulará la validación del usuario. El formulario de login direcciona al archivo index.php y envía por post el controlador controladorPrincipal y el método login. Nuevamente se el punto de ingreso es el archivo index.php, en este caso se ejecuta el método login del ControladorPrincipal.
En el método login se recuperan los valores enviados por el usuario para iniciar sesión. Luego se instancia la vista, con un detalle adicional, se envía como parámetro la ubicación del un archivo javascript, esto es útil porque permite que cada vista tenga su propio javascrip con las validaciones o funciones que se necesiten en cada caso particular. Si hay funciones o cosas que deben tener todas las vistas se incluyen en la plantilla html, si hay funciones que solo se utilizan en una vista se incluyen acá, evitando cargar código innecesario. A continuación se hace una instancia del modelo y se ejectua el método login enviando los datos ingreados por el usuario. Con el resultado devuelto por el modelo se habilita o no el ingreso al sistema (en este caso solo aparece una leyenda). Veamos las clases Modelo y ModeloPrincipal:

En Modelo tenemos los datos propios para conectar a la Base de Datos (en este caso MySQL) y métodos para abrir y cerrar la conexión (no se usan porque se simula la conexión).


ModeloPrincipal solo tiene el método login donde habría que abrir la conexión, realizar la consulta a través de un scrip SQL o un SP, evaluar los resultados y luego cerrar la conexión. El resultado se la ejecución del método retorna al controlador donde se evalúan las reglas de negocio. Por último en el controlador se cargan los valores devueltos por el modelo en la vista y se ejecuta mostrarHTML.


Pueden descargar el código de acá: MVC-PHP

Comentarios

Entradas más populares de este blog

Como eliminar coordenada Z de elementos (Autocad, VLisp)

Este ejemplo muestra como poner en cero la coordenada Z de unos elementos dentro de un dibujo de AutoCAD, es decir "baja" las entidades que estén dibujadas a una altura en el eje Z y le asigna el valor "0", o en el caso de polilíneas 3d las aplana poniendole a todos sus vertices una altura 0 en Z y respentando sus coordenadas X e Y. Solo tiene en cuenta los puntos, los textos (TEXT y MTEXT), las líneas y las polilíneas. Básicamente lo que hace es hacer un conjunto por cada tipo de entidad (línea, polilínea, texto, y punto) analizar los puntos por cada uno de los elementos dentro del conjunto y redefinir cada punto poniendo en 0 su coordenada Z, en el caso de las polilíneas recorre uno por uno todos los vértices que la componen. El ejemplo puede mejorarse, quizás no sea la forma más óptima de hacerlo, por ejemplo podriamos hacer solo un conjunto y trabajar con todos lo elementos, pero bueno de esta manera quizás es un poco más claro, además hay que tener en cuenta qu

Instalar SQL Server Mobile edition en la PDA

Esta es una breve explicación de como instalar SQL Server 2005 Mobile edition en el dispositivo móvil para poder desarrollar alguna aplicación con base de datos. Dependiendo de la versión de Visual Studio 2005 que tengamos puede que SQL Server Mobile venga o no incluido (creo que SQL Server solo viene en las versiones pro o superiores), si viene incluido los más probable es que esté en el directorio " C:\Archivos de programa\Microsoft Visual Studio 8\SmartDevices\SDK\SQL Server\Mobile\v3.0\Sqlce30setupen.msi " (suponiendo que Visual Studio esté instalado en la ubicación por defecto), si no lo tenemos podemos descargarlo acá (el archivo es algo así como Sqlce30setupen.msi). La instalación en la pc es sencilla tiene unos requerimientos de Software como Windows 2000 SP4 , Windows XP SP2 o Windows 2003 , obviamente una cuenta con privilegios de administrador, .NET framework 2.0 (si tenemos instalado Visual Studio 2005 ya está instalado), MDAC 2.7 para el acceso a datos,