Planificación de un proyecto modular

En este artículo mostraré mi visión sobre la organización de los proyectos en PHP y las posibles técnicas para optimizar el trabajo, además de introducir las bases para una programación modular.

Cuando queremos comenzar un proyecto individual en PHP de pequeña-mediana escala y no utilizamos un framework debemos tener en cuenta muchos factores al organizar el proyecto, de la buena planificación de estos factores depende en gran parte el éxito del proyecto y un fácil mantenimiento, ampliación, modificación, etc. Con la experiencia se va aprendiendo a organizar mejor las carpetas, a crear y organizar mejor el código, a reutilizar mejor nuestras funciones básicas, en definitiva a optimizar el ritmo de trabajo con una serie de técnicas que deberían de repetirse en cada proyecto nuevo que iniciamos. Personalmente creo que esta división organizativa se puede dividir en varios puntos:

  • Organización en el servidor
  • Organización del código reutilizable
  • Organización del código que generamos

Organización en el servidor

Para que nuestro proyecto sea consistente y a la vez fácil de entender es básico que planifiquemos una programación modular, eso implica por ejemplo una distribución de carpetas en el Server de manera que nos sea fácil identificar cualquier código y acceder a él. Si al código le añadimos los xml que queramos generar para sindicaciones, las imágenes que utilicemos, los css y demás requerimientos es necesario una distribución práctica y sencilla. La distribución de carpetas que a mi me resulta útil es la siguiente:

  • modulos: aquí introduciremos todas las secciones de nuestro proyecto (página principal, contacto, catálogo, registro…)
  • includes: aquí colocaremos todos los php comunes y reutilizables (funciones, conexión bbdd…)
  • css: para los documentos de estilos
  • imágenes: para las imágenes que utilicemos
  • xml: para los xml de sindicación
  • js: para los javascripts que utilicemos en el proyecto

Personalmente también divido algunos módulos en varias partes, es decir, imaginemos que tenemos un módulo de noticias que es una sección de la web donde mostramos noticias de un determinado tema, bien pues creo que lo más útil(que no lo más óptimo) sería dividir este código en porciones de la siguiente manera:

  • noticias.php en la carpeta modulos: el módulo noticias únicamente con el código php y html que implementa la forma de mostrar las noticias.
  • noticias_consulta.php en la carpeta includes: la consulta a la base de datos para recoger este conjunto de noticias con unos parámetros previos, incluso podríamos generar una función si la utilizamos en otros sitios.
  • noticias_paginacion.php en la carpeta includes: la paginación de las noticias, igual que antes podríamos generar una función con parámetros para la paginación de varios listados de la web.

Como veis la nomenclatura es importante ya que así podemos identificar fácilmente los archivos de un mismo módulo dentro de la carpeta includes.

Por otra parte hay que decir que en la en la raíz únicamente tendremos el index.php y el htaccess (si utilizamos un servidor apache, que seguro que sí ;p), así conseguiremos una buena organización que quizá no se vea especialmente útil cuando se plantea, pero seguro que lo agradeceréis cuando volváis a trabajar en el proyecto pasado un tiempo.

Organización del código reutilzable

Evidentemente este es un punto que nos será útil una vez hayamos hecho varios proyectos y pruebas, a partir de aquí seguro que nos damos cuenta que hay porciones de código o funciones que podemos reutilizar en otros proyectos.

Lo ideal es que hagamos funciones con el código reutilizable, ya que así nos ayudará que nuestro programa sea más legible y más limpio que si lo utilizáramos directamente, de todos modos en cada proyecto nuevo sabremos identificar el código reutilizable y optimarlo para futuros proyectos, que en definitiva es de lo que se trata. En un artículo próximo implementaré algunas funciones en PHP que considero útiles para gran parte de nuestros códigos.

Organización del código que generamos

Bien pues esta es la parte importante del tema, el código que generamos creo que ante todo tiene que ser legible y limpio, porque en nuestro caso creo que es mucho más importante la claridad y organización que la optimización.

Seguramente muchos programadores con experiencia piensen que lo ideal es separar la lógica de la estructura (con plantillas como Smarty por ejemplo) pero sinceramente creo que no es necesario, en proyectos pequeños o medianos no vale la pena porque creo que se tarda demasiado (en relación con los beneficios) en separar el php del html y no aporta prácticamente ningun beneficio práctico (a excepción de vanagloriarse por ello) ya que el hecho de mezclar el código php y el html en la mayoría de los casos no tiene porqué ser sinónimo de ensuciar el código.

De todas maneras, conseguir un código limpio no es tan fácil como parece, al programar todos tenemos malos vicios que son muy difíciles de quitar, pero poco a poco aprendemos a mejorar.

Estas podrían ser algunas guías para mejorar nuestro código:

  • Establecer una nomenclatura de nombres en:
    • nombre de los archivos PHP
    • nombre de variables (diferenciar por ejemplo los arrays con un “_” delante del nombre), constantes (en mayúsculas por ejemplo), etc.
  • Ordenar de forma lógica las operaciones de nuestro código
  • Correcta identación del código
  • Crear funciones para acciones (por ejemplo interacciones con la BBDD)
  • Si el código es extenso, podemos dividirlo en porciones lógicas más pequeñas e incluir éstos códigos en el código principal
  • Añadir comentarios explicativos para entender el código (recuerda que si pasan meses y te pones otra vez lo agradecerás tú mismo, así que imagínate si lo lee otra persona que no lo ha creado)

Modularidad

Cualquier web que podamos hacer en PHP tiene secciones diferentes, estas secciones las creamos en PHP de forma modular, esto significa que tenemos un archivo (index.php) que se encarga de llamar a cada sección dependiendo de los parámetros que le pasemos, esto hace que sea muy fácil añadir, modificar o eliminar secciones de la web. Lo más fácil para ver el funcionamiento es un ejemplo:

<?
//index.php
session_start ();
error_reporting ( E_ALL );
include_once( $_SERVER [ ‘DOCUMENT_ROOT’ ]. ‘/includes/conexion.php’ );
include_once( $_SERVER [ ‘DOCUMENT_ROOT’ ]. ‘/includes/funciones.php’ );

/*aqui incluimos todas las funciones, conexiones, etc. Ponemos el error_reporting a E_ALL para que podamos ver todos los fallos */

/*… todo nuestro html …*/

if ( file_exists ( $_SERVER [ ‘DOCUMENT_ROOT’ ]. ‘/modulos/’ . $_GET [ ‘modulo’ ]. ‘.php’ )) include_once( $_SERVER [ ‘DOCUMENT_ROOT’ ]. ‘/modulos/’ . $_GET [ ‘modulo’ ]. ‘.php’ );
else echo “<p class=’error’>El archivo al que intentas acceder no existe. Verifica la dirección.</p><p><a href=’/’>Principal</a></p>” ;

/*… html restante*/
?>

Como vemos en nuestro index.php incluimos nuestras funciones y conexión con la BBDD y además requerimos los módulos. En este caso los módulos estan en la carpeta modulos y por GET recibo el modulo al cual se quiere acceder, y solo accedo a el si existe en la carpeta ‘modulos’. Sencillo no?

Entonces en cada módulo solo debemos implementar la sección que queramos, aunque aquí no acaba todo, para hacerlo más accesible el acceso a cada módulo lo haremos transformando las URL en URLs amigas (Friendly URLs) con un htacces (más concretamente mediante mod_rewrite del apache), es decir que para acceder al modulo de noticias la url sería http://www.dominio.com/noticias y el htaccess nos la transformará en http://www.dominio.com/index.php?modulo=noticias&pagina=1 (¿Mucho más bonita la URL de antes no?)

ErrorDocument 404 / modulos / error . php
RewriteEngine on
RewriteRule ^ principal $ / index . php [ L ]
RewriteRule ^ contacto $ / index . php ? modulo = contacto [ L ]
RewriteRule ^ noticias $ / index . php ? modulo = noticias & pagina = 1 [ L ]

Lo primero que hemos hecho con el htacces es decirle qué php tiene que ejecutar en caso de error 404 y acto seguido activamos el motor para reescribir las URLs del Apache. El símbolo “^” es para decirle que la cadena comienza y el “$” para decirle que ahí acaba. Acto seguido introducimos la cadena que aparecerá en nuestra url, dejamos un espacio y introducimos en lo que queremos que se convierta, la [L] final significa que no es una redirección, así no cambiará la url original por la reescrita. Y ya está! Esto debemos hacerlo para cada nuevo módulo, y es un cambio muy significativo en la experiencia de usuario, ya que es mucho más fácil e intuitivo recordar estas nuevas direcciones.

Como buen seguidor de los estándares un gran error de muchas webs modulares es que no tienen en consideración los Meta-Tags de cada módulo, y eso empobrece mucho la web además de desfavorecerla en los buscadores. Por tanto implementaremos el archivo metas.php (que guardaremos en la carpeta includes) para corregir esto, así que el archivo metas.php lo tendremos que incluir en el index.php en el lugar donde irían los metas (title, keywords, description, etc.)

<? if( $_GET [ ‘mod’ ]== “contacto” ){ ?>
<title>Titulo del modulo</title>
<meta name=”keywords” content=”palabras clave relacionadas con el modulo” />
<meta name=”description” content=”descripción del modulo” />

<? }
else if( $_GET [ ‘mod’ ]== “catalogo” ){ ?>
<title>Titulo del modulo</title>
<meta name=”keywords” content=”palabras clave relacionadas con el modulo” />
<meta name=”description” content=”descripción del modulo” />

<? }
else { ?>
<title>Titulo de la pagina principal</title>
<meta name=”keywords” content=”palabras clave relacionadas con la web” />
<meta name=”description” content=”descripción de la web en general” />
<? } ?>

Como veis tendremos que crear los metas para cada modulo, y unos metas por defecto que se utilizaran en la página principal, con estos sencillo pasos lograremos una web modular consistente.

Deja un comentario