Blog / PHP / Estructura de directorios
Todo framework y proyecto,
tienen una estructura de directorios que les es propia,
a veces las dos.
En un proyecto PHP si creamos una estructura
funcional y coherente, podremos reusarla y evolucionarla
de forma que en algún momento podrá ser una entidad
independiente de las aplicaciones que contiene.
Estructura de la aplicación PHP
Esta estructura, podría decirse que es común en proyectos
basados en una arquitectura MVC y otras arquitecturas,
se basa en la "repetición".
Simplificando mucho, digamos que tenemos un proyecto
donde la estructura de carpetas de partida es:
Replicando la estructura
Voy a seguir la nomenclatura de nombrado de
clases de Laravel para modelos y controladores,
pero no su estructura concreta.
Empezamos por los controladores.
Tengo un controlador principal de nombre "Controller",
otro para los usuarios y otros dos para un pequeño blog.
La estructura quedaría:
Controllers/
|
|-- Controller.php
|-- Users/
| |-- UsersController.php
|
|-- Posts/
|-- PostsController.php
|-- PostImagesController.php
Siguiendo por los modelos:
Models/
|
|-- Model.php
|-- Users/
| |-- User.php
|
|-- Posts/
|-- Post.php
|-- PostImage.php
Y acabando por las vistas:
Views/
|
|-- layout.php
|-- posts/
| |-- index.php
| |-- create.php
| |-- edit.php
| |-- post.php
| |-- images/
| |-- index.php
| |-- create.php
| |-- edit.php
| |-- image.php
|
|-- users/
|-- index.php
|-- create.php
|-- edit.php
|-- user.php
Creo que la idea de repetir está bastante clara,
aunque las vistas comienzan a mostrar una estructura divergente.
Hasta el infinito y más allá: las vistas
Las vistas precisamente suponen un punto de inflexión a la hora
de organizar los directorios y ficheros, aunque el esquema
es bastante simple, en realidad tendremos que lidiar con templates
"duplicados", por ejemplo, para las entradas de un blog
existirán unos en una parte pública y otros en una privada
(área de administración), habrá templates que serán comunes,
como "layout.php" que se compondría a su vez de partes más o menos
comunes y a generalmente también duplicadas: "header.php",
"nav.php", "aside,php", ... páginas públicas adicionales:
home.php, contacto.php, ... páginas para autenticarnos en su caso:
login.php, templates de error, feedbacks, ...
podremos extraer fragmentos comunes de cada una de las diferentes
"páginas",
requerir *composers...
Y aún estamos en una aplicación web muy sencilla. Por eso se dice
que todo sistema tiende a volverse caótico y rápido.
Con todo lo anterior, nuestro esquema anterior podría ser:
Views/
|
|--- auth/
| |-- login.php
|
|--- errors/
| |-- 404.php
| |-- 500.php
|
|--- feedbacks/
| |-- error.php
| |-- success.php
| |-- traces.php
| |-- warning.php
|
|-- layout
| |-- layout.php
| |-- parts
| |-- aside.php
| |-- footer.php
| |-- header.php
| |-- nav.php
|
|-- private/
| |-- index.php
| |-- posts/
| | |-- index.php
| | |-- create.php
| | |-- edit.php
| | |-- post.php
| | |-- images/
| | |-- index.php
| | |-- create.php
| | |-- edit.php
| | |-- image.php
| |
| |-- users/
| |-- index.php
| |-- create.php
| |-- edit.php
| |-- user.php
|
|-- public/
|-- index.php
|-- contact.php
|-- faqs.php
|-- legal.php
|-- webmap.php
|-- posts/
|-- index.php
|-- post.php
También necesitaremos controladores adicionales,
con un propósito bien definido:
FrontController.php (mostrar las páginas principales),
ContactController.php (gestionar los mensajes de contacto recibidos),
LoginController.php (inicio de sesión de usuario), ...
Nota: en Laravel disponemos de View Composers
y Components aparte de los propios templates.
Cuando me referí a los "composers" me refería a funciones
adicionales a las vistas que puedan usarse para crear ciertas
estructuras de uso habitual, por ejemplo, una función que
recibiendo un array de strings devuelve una lista HTML,
lo que internamente se parece los Components de Laravel
más que a sus Composers, cuestión de nomenclatura.
Punto de entrada
La aplicación además de todo lo anterior tiene otros ficheros
y grupos, contará siempre con un punto de entrada
que es el fichero donde empieza a cargarse todo lo demás
con cada petición, algún sistema de rutas, servicios, helpers, etc.
12-11-2020