Cómo Separar y Organizar los Archivos de tu Proyecto

Como dividir el código en archivos y directorios para generar una arquitectura practica que facilite
hacer cambios y mantener todo en orden

Como dividir el código en archivos y directorios para generar una arquitectura practica que facilite hacer cambios y mantener todo en orden

Conforme van creciendo las funcionalidades de nuestro software cada vez tendremos más líneas de
código y no es para nada recomendable sumar miles de líneas en un solo archivo.

Por ello es recomendable desde un inicio ir dividiendo nuestro software en partes mas pequeñas y
modulares.

También esta la opción de que necesitemos usar módulos creados por otras personas, por lo que es muy
útil que nuestro código desde un inicio sea compatible con código de terceros.

Hay muchas formas diferentes de crear directorios para organizar los módulos de nuestro software, y
hay varias formas de cortar archivos grandes en rebanadas mas pequeñas y crear así módulos más
pequeños.

Afortunadamente PHP es muy flexible a la hora de permitirnos armar un software compuesto de múltiples
módulos.

Recordemos que un módulo puede ser cualquier cosa, desde un archivo con unas
cuantas variables o constantes (Pueden ser archivos de configuración, paquetes de idioma, valores
por defecto, datos estáticos que no cambiaran, etc.) hasta uno o multiples archivos que contienen
una o multiples estructuras.

Aprendamos a organizar el código

Para cortar nuestro código en rebanadas modulares lo primero será plantearnos que estructura de
directorios deberíamos manejar.

Lo mejor será siempre tener los directorios con nombres claros y mantener una estructura simple de
forma que la arquitectura del proyecto sea tan clara que grite de que se trata cada cosa.

Aunque no siempre será posible dejarlo tan claro, por ejemplo al decidir implementar algún framework
o al empezar a trabajar en un proyecto ya existente, estos ya cuentan con estructuras predefinidas y
muchas veces es poco clara y poco flexible.

Un Framework es una colección de piezas de software reutilizables que se emplean
para ser mas eficientes a la hora de desarrollar.

Separación por conceptos y por capas

La idea general que se aplica a la mayoría de proyectos es la de separar las piezas del software en
al menos 4 conceptos:

  • Módulos internos del programa en cuestión
  • Configuración
  • Framework e Infraestructura
  • Módulos de terceros

Luego ya cada proyecto define varias capas extra para separar en aún mas conceptos los módulos
internos del programa. Las capas en las que se suelen separar serían:

  • Capa de dominio
  • Capa de datos
  • Capa de presentación

La capa de dominio es donde viven las reglas que gobiernan el comportamiento y funcionalidades del
software.

Al ser esta capa el núcleo de un software, es la parte que conlleva mas mantenimiento y la que mas
evoluciona y va cambiando conforme nacen nuevos requerimientos, por lo que identificar y separar los
elementos de esta capa del resto de capas es muy importante.

Estructura de directorios base

Basándonos en todo esto veamos cual sería una estructura base recomendada para los directorios de una
aplicación en PHP:

config/ # Archivos de configuración
public/ # Archivos visibles desde internet
    index.php # Puerta de acceso a nuestra aplicación
src/ # Código fuente de la aplicación
vendor/ # Módulos de terceros

Esta estructura de directorios podría parecer rara de momento pero con el tiempo la normalizaremos y
en un inicio no parece que se relacione directamente con la separación por conceptos que
mencionamos, pero aún falta añadir el resto de conceptos y explicar que propósito cumple cada
directorio.

Con el directorio config creo que esta muy claro que clase de archivos agregaremos ahí.

El directorio public es donde colocamos archivos estáticos normales de una web como: css, js, html,
imágenes, etc.

Por seguridad debemos bloquear el acceso a los archivos PHP de nuestro software, por ello es común
encontrar en la carpeta public un archivo index.php con la lógica para servir como puerta de entrada
a la aplicación, y el servidor web se configura para enviar todas las peticiones a se archivo.

El directorio vendor es el lugar donde el gestor de paquetes de PHP (Composer) normalmente descarga
los módulos de terceros, aunque también podemos configurar el gestor para que descargue módulos que
nosotros mismos hayamos creado.

La carpeta src es la que contendrá el núcleo de la aplicación, dentro crearemos los directorios
necesarios para ayudarnos a organizar el dominio de nuestro software, y hay varias formas de
hacerlo.

Añadiendo el resto de conceptos a la estructura

La forma con la que encontraremos muchos proyectos, sobre todo los que funcionan con frameworks de
terceros es la que dentro del directorio principal inmediatamente añaden directorios extra para el
resto de capas, dando una estructura como la siguiente:

config/ # Archivos de configuración
public/ # Archivos visibles desde internet
    index.php # Puerta de acceso a nuestra aplicación
src/ # Código fuente de la aplicación
    controllers/ # Código que comunica los datos con la interfaz de usuario
    models/ # Código que gestiona los datos
    views/  # Código que genera la interfaz de usuario
vendor/ # Módulos de terceros

Esta estructura esta bien para apps pequeñas, pero para software mas robusto y con muchos módulos
internos no se recomienda esta estructura, lo recomendable sería crear un directorio por módulo y
luego dentro de cada módulo hacer la separación por capas, dejándonos con una estructura parecida a
la siguiente:

config/ # Archivos de configuración
public/ # Archivos visibles desde internet
    index.php # Puerta de acceso a nuestra aplicación
src/ # Código fuente de la aplicación
    cart/
        controllers/ # Código que comunica los datos con la interfaz de usuario
        models/ # Código que gestiona los datos
        views/  # Código que genera la interfaz de usuario
    product/
        controllers/ # Código que comunica los datos con la interfaz de usuario
        models/ # Código que gestiona los datos
        views/  # Código que genera la interfaz de usuario
    user/
        controllers/ # Código que comunica los datos con la interfaz de usuario
        models/ # Código que gestiona los datos
        views/  # Código que genera la interfaz de usuario
vendor/ # Módulos con módulos creados por terceros

En resumen

Cuando se empieza a trabajar en un proyecto existente se recomienda seguir el estilo del proyecto
anterior.

Por lo que diseñar una buena estructura para el software desde el inicio ahorrara mucho tiempo en el
futuro y agilizara el mantenimiento al permitir encontrar los archivos a modificar sin tanto
esfuerzo y de forma intuitiva y al indicar cual debe ser la arquitectura para nuevos módulos.

PHP nos da la libertad de poder crear cualquier estructura que nos parezca conveniente, pero hay que
pensar bien en cual escoger.

Recuerda no mezclar conceptos y mantener todo lo mas modular posible, siguiendo las buenas practicas
del desarrollo de software y de la programación orientada a objetos.