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.
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.