Estoy preparando un pequeña estructura de directorios para poder usar como modelo al iniciar un proyecto, estoy enganchado a Composer y adaptándome a usar Docker, por lo que ya genero todo con esto en mente y dejo los ficheros básicos preconfigurados. Todo debe estar organizado bajo un árbol de directorios claro, que nos permita clasificar y separar los diferentes archivos de configuración, dependencias, herramientas y código fuente. Habitualmente en el directorio raíz dejo los archivos relacionados con la virtualización, configuración, temporales, etc… es el nivel “máquina”, después genero una carpeta src donde vuelco todo mi código fuente, tests y carpetas de librerías externas.

El directorio raíz

El nombre de esta carpeta es la principal seña de identidad del proyecto, debería tener un nombre claro y descriptivo. Generalmente utilizo el mismo que le voy a dar al repositorio, de manera que de un vistazo a mi carpeta de proyectos sepa qué es cada cosa. Dentro de este primer nivel encontramos ficheros como composer.json (dependencias) y/o Dockerfile + docker-compose.yml (virtualización del proyecto). También el readme.md, un fichero en el que se puede describir el proyecto, su uso y dependencias. La mayoría de los repositorios tipo Git van a ser capaces de interpretar este contenido markdown para generar una página informativa del proyecto. Estos archivos son totalmente opcionales, cualquier cosa que sea innecesaria o no se adecue a nuestro desarrollo se podrá eliminar sin problemas, los incluyo para preconizar el uso de las herramientas PHP actuales.

En este primer nivel trabajo con dos tipos de directorios además de src. Por un lado, los que contienen o van a contener los archivos de configuración necesarios para el setup de la máquina, virtual o no, que va a sostener el desarrollo, como config y sql. Por otro lado dispongo los directorios que van a contener ficheros generados durante la ejecución o despliegue del proyecto, como log, tmp y build. Para evitar que GIT versione el contenido de este segundo tipo de directorios, incluyo en el raíz de cada subnivel un fichero .gitignore muy sencillo. Ignora todo * salvo a si mismo !.gitignore.

1
2
3
*

!.gitignore

Los subdirectrorios de configuración e inicialización

config
Destinado a almacenar ficheros como la configuración especifica de apache, php.ini o cualquier otra cosa que necesitemos para configurar el servidor que de vida al proyecto.

sql
Contendrá un fichero o varios con la estructura de la base de datos, de manera que al hacer un rebase del proyecto a otras maquinas tengamos disponible una importación que nos inicialize la base de datos y así poder comenzar a desarrollar.

Los subdirectrorios de trabajo

build
Contendrá los archivos resultado generados por las herramientas de calidad del código, como los análisis de coverage, phpmetrics etc… Configuro las herramientas para que dejen estos logs aquí. Dependiendo de lo que se este haciendo y el interés que se tenga en estas métricas se puede subdividir esta carpeta o no.

db
Para los archivos generados por el container docker de base de datos ;)

log
Es el lugar que preparo para que apache o mysql dejen los archivos de log, también los propios de la aplicación. Esta carpeta se desglosa en varios subniveles, como apache, sql o app.

tmp
Destinada a hacer de directorio temporal para el proyecto, compilaciones de smarty, archivos de cache, compilaciones de gettext o cualquier operación que implique permisos de escritura para el usuario nobody.

Estos subdirectorios deberán tener una gama de permisos que permitan a los usuarios de los servicios determinados escribir en ellos (nobody, mysql, etc).

src, El código

src/private
El código fuente de la aplicación, modelos, controladores, scripts, todo lo que desarrollemos debería estar aquí dentro.

src/public
Contiene los ficheros expuestos por el servidor (DocumentRoot), generalmente un index que direcciona las peticiones de los navegadores al código fuente dentro de src/private.

src/test
Es el lugar para los tests, en esta caso contiene la configuración base de PHPUnit, los direcotorios files y private para alojar los tests de nuestras clases definidas en src/private.

src/vendor
Aquí dejará composer las librerías de las dependencias y los archivos de autoload.

Para este grupo de carpetas generalmente solo hacen falta permisos de lectura para el usuario apache.

Dejo descrita la sección de la configuración de /composer.json para que utilice el directorio src/vendor, también la configuración básica de un namespace con el estándar de autoloading psr-4.

1
2
3
4
5
6
"config": {
"vendor-dir": "src/vendor"
},
"autoload": {
"psr-4": { "MyApp\\": "src/private" }
}

Este es más o menos el árbol de directorios que utilizo para organizar los proyectos y cosas nuevas que voy desarrollando, creo que se adapta bien a todas las herramientas que suelo utilizar, tanto desde shell como desde el IDE. Supongo que cada uno tiene su estructura ya más o menos establecida, lo importante es que los permisos y visibilidad de los directorios no comprometa la seguridad del proyecto, una vez asegurado esto, podemos almacenar el código y su setup como nos haga sentir más cómodos.