Framework-PHP-usando-MVC

image

En este proyecto que he realizado, he creado mi propio framework de PHP, de manera justa para que todo funcione y que tengo pensado ampliar en un futuro, basándose en el patrón de arquitectura de software Modelo-Vista-Controlador, con el objetivo de crear una aplicación que me facilitase la creación de aplicaciones en PHP sin delegar acciones a alguna dependencia y así aprender en profundidad PHP.

Para seguir este proyecto, deberías conocer PHP en profundidad, manejo de servidores Apache, programación orientada a objetos y entender cómo funciona el patrón de arquitectura de software Modelo-Vista-Controlador.

Índice:

  1. Directorios y ficheros del framework y su significado
  2. Ruteo de la URL
  3. Creación del core del framework
  4. Conexión entre modelos y bases de datos con PDO

Directorios y ficheros del framework y su significado

<nombre_de_tu_proyecto>
│ 
├── app/
│   ├── controllers/
│   │   ├── home.php
│   │   └── _404.php
│   ├── core/
│   │   ├── App.php
│   │   ├── Controller.php
│   │   ├── config.php
│   │   ├── functions.php
│   │   └── Database.php
│   ├── models/
│   │   └── User.php
│   ├── views/
│   │   ├── home/
│   │   │   └── index.php
│   │   └── _404/
│   │       └── index.php
│   └── init.php
├── public/
│   ├── index.php
│   ├── assets/
│   │   ├── css/
│   │   │   └── style.css
│   │   ├── sass/
│   │   │   └── main.scss
│   │   ├── js/
│   │   │   └── script.js
│   │   └── images/
│   │       └── logo.png
│   └── .htaccess
└── README.md

Directorio raíz

Dentro del directorio raíz, que tendrá el nombre del proyecto que vamos realizar, tenemos 2 carpetas public y app.

public

La carpeta public es la carpeta de producción que verá el usuario final. En ella almacenaremos todos los recursos necesarios para el frontend de la aplicación como assets, css, js, images, etc.

app

La carpeta app es la carpeta de desarrollo. En ella iremos creando nuestra aplicación con el modelo de arquitectura de software MVC.

public

index.php

Es el fichero que se cargará cuando un usuario entre en /public dentro de él incluiremos la aplicación creada dentro de la carpeta app con las líneas de código. (recordemos que estamos usando MVC) que previamente habrá sido cargada en app/init.php

image

assets

Todo lo relacionado con los assets de mi página como script.js css, imágenes…

.htaccess

Dentro de public a parte de los assets tendremos otro fichero .htaccess cuyo objetivo principal será el enrutamiento y la creación de url amigables, es decir, que si el usuario pone una url inexistente se irá a 404 not found. Contenido más adelante

app

init.php

Dentro de init.php vamos a introducir el contenido del core de la aplicación que serán los archivos base sobre los que se cimenta nuestra aplicación con el MVC.

image

core/

Dentro de la carpeta core crearemos los ficheros .php sobre los que se cimentará nuestra aplicación como App.php, Controller.php, etc. Los ficheros que empiezan con mayúscula se refieren a clases.

core/Controller.php

Antes de empezar a crear la app que será el núcleo de nuestra aplicación creemos Controller.php que será el controlador cuya lógica heredarán todos los controladores de nuestra aplicación. El código es este:

image

core/config.php

En config vamos a tener principalmente constantes de configuración de nuestro servidor y la base de datos que vayamos a usar para el proyecto.

image

core/functions.php

En functions vamos a tener funciones que iremos reutilizando en distintos ficheros.

image

core/Database.php

En este fichero vamos a crear el Trait Database que nos servirá para conectarnos a la base de datos además, aunque podemos crearla como clase pero no tiene ninguna dificultad.

Traits

Un trait y una class son parecidos solo que un trait a diferencia de una clase no se puede instanciar debe ser usado con use. Esto nos permitirá más adelante en los modelos usar la base de datos sin gastar el extends por si nos hiciera falta.

image image image

core/App.php

Dentro del fichero app es donde se ejecutará verdaderamente nuestra aplicación. Se sanitizar la url en que se encuentre el usuario y con ello se crearán los controladores con sus métodos de acción correspondientes. El controlador por defecto será home.php y su método de acción por defecto será index().

image image

controllers

En la carpeta controllers crearemos los controladores específicos que heredarán del Controller del core, y que tendrán métodos de acción donde como en cada controller de MVC nos comunicaremos con los modelos para obtener datos y el resultado de estos los mostraremos a partir de vistas. El controlador por defecto es home.php.

models

En la carpeta models crearemos los modelos que usaremos. En particular, estos modelos usarán un Trait que es la conexión con la base de datos. Explicación en el apartado de la base de datos.

Model

Model es el modelo que hemos usado para esta aplicacion de ejemplo para nuestro framework de php en él se hace uso de conexiones con la base de datos para obtener, modificar o eliminar información de la misma. El código dentro de model es este:

image image image image image

views

Dentro de views crearemos las vistas. Que como ya deberíamos saber, en el MVC se utilizan para mostrar el resultado de las operaciones realizadas entre el controlador y el modelo.

Ruteo sencillo de la URL

Qué es lo que queremos hacer, vamos a hacer que cuando un usuario introduzca una url que no existe en nuestra aplicación que no salga error sino que lo redirija a una página de ERROR 404 NOT FOUND.

También estableceremos el controlador y su método por defecto en caso de que no se hayan introducido parámetros extra en la URL.

El archivo .htaccess nos permitirá hacer que si el usuario introduce el nombre de un fichero o de un directorio de manera correcta por URL permita mostrarlo pero en caso contrario queremos que nos redirija a la url por defecto. Y si es incorrecto se usará el controlador _404.php para mostrar que no se ha encontrado el recurso que busca. El contenido es:

image

Direccion por defecto

$controller será el controlador por defecto, es decir cuando entremos en la aplicación se ejecutará el archivo controlador home.php

$method será el método del accion de ese controlador que se ejecute por defecto al entrar en la aplicación.

$params será un array de tantos elementos como subdirectorios tenga la url a partir del nombre public/ nos servirá para introducir parámetros a partir de la url. Y se ejecutarán en una callback que veremos más adelante.

E.g: si la url es mvc/public/carpeta/archivo.php $params será array(‘carpeta’, ‘archivo.php’); El MVC usa PHP con POO recuerda.

Sanitización de la URL

Con esta función obtendremos de manera sanitizada los elementos que hayamos puesto después de public y que para que nos hagamos una idea funcionará de la siguiente manera: miAplicacion/public///param1/param2/param…

Si la url no existe, nos pondrá el controlador por defecto y su método.

image

Creación del core del framework

Finalmente, dentro del constructor de nuestra aplicación, vamos a crear la lógica cuya función será hacer uso de un controlador por defecto o introducido por el usuario y también de un método y pasándole los parámetros que veamos correspondientes será así.

image image

Ejecución del controlador con su método de acción

Una vez hayamos hecho uso de call_user_func_array con el controlador y su método de acción que queramos y los parámetros, se ejecuta el método de acción de ese controlador y ya pasamos al fichero por ejemplo con el controlador home y su método de acción saludar con el parámetro $nombre.

El código del controlador home.php para un TODO LIST en PHP sería este:

image

Conexión a bases de datos con PDO

Para implementar la base de datos en nuestro MVC vamos a usar PDO.

Config.php

Recordemos que en config.php vamos a definir constantes que tendrán los datos necesarios para realizar una conexión con PDO.

image

Database.php

Database.php nos va a permitir crear una conexión con PDO a nuestra base de datos, además los parámetros los definiremos como constantes en config.php.

Traits

Un trait y una class son parecidos solo que un trait a diferencia de una clase no se puede instanciar debe ser usado con use. Esto nos permitirá más adelante en los modelos usar la base de datos sin gastar el extends por si nos hiciera falta.

image image image

Conectando con la Base de Datos

Tenemos que crear la base de datos, yo usaré MSQL en phpmyadmin, pero podemos usar el gestor de bases de datos que más nos guste.

image

Base de datos en acción

Ahora nos vamos al controlador de home.php en el que, gracias a la herencia que recibe de Controller.php, vamos a crear una instancia del modelo que queramos usar y vamos a realizar una serie de operaciones cuyo resultado final mostraremos a través de una vista.

image

¿Qué hace el código de arriba?

  1. Instancia un nuevo modelo Model.php
  2. Si $_POST tiene establecido add quiere decir que se han pasado los datos para crear un nuevo TODO
  3. Invoca el método addTodo
  4. Invoca el método refreshTodo para actualizar los todos de esa instancia de Modelo
  5. Finalmente muestra el resultado al usuario usando la vista index.php en la carpeta home dentro de la carpeta views. Esta dirección no tiene nada que ver con el ruteo de URL que hemos hecho antes.

FIN

Y esto ha sido todo, cómo crear un framework PHP que hace uso del modelo vista controlador y con un ruteo básico.