IronWoods.es

Desarrollo web

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:

  • Controllers
  • Models
  • Views
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