Índice de contenido
Un proyecto en Laravel puede variar bastante en su estructura según la configuración que realices y los paquetes que instales. No solo hablamos de herramientas de entorno como Laravel Sail; a partir de Laravel 11 se introducen cambios importantes en la organización del proyecto que vale la pena conocer desde el principio. A continuación, revisamos las carpetas y archivos principales que encontrarás en cualquier proyecto Laravel.
La carpeta app
La carpeta app es el corazón de la aplicación: aquí vive casi todo el código de negocio y es donde pasaremos la mayor parte del tiempo de desarrollo. Contiene las clases principales de la aplicación organizadas en subcarpetas como Http, Models, Console y Exceptions, entre otras que se crean según las necesidades del proyecto.
La carpeta bootstrap
La carpeta bootstrap contiene el archivo app.php, que se encarga de inicializar el framework. El flujo de arranque comienza en public/index.php, que es el primer archivo que ejecuta el servidor web y que a su vez carga bootstrap/app.php para levantar toda la aplicación. Dentro de esta carpeta también encontrarás una subcarpeta cache con archivos generados automáticamente por el framework para optimizar el rendimiento, como la caché de rutas y servicios compilados. En condiciones normales, no necesitas tocar nada aquí.
La carpeta config
La carpeta config centraliza todos los archivos de configuración de la aplicación. Aquí encontrarás archivos como app.php, database.php, cors.php, mail.php y muchos más, cada uno responsable de un aspecto específico del sistema. Cualquier paquete de terceros que instales también puede publicar sus propios archivos de configuración en esta carpeta mediante el comando php artisan vendor:publish.
La carpeta database
La carpeta database alberga todo lo relacionado con la base de datos: las migraciones (en database/migrations), que definen y versionan el esquema de las tablas; las factories (en database/factories), usadas para generar datos de prueba; y los seeders (en database/seeders), que permiten poblar la base de datos con datos iniciales. Opcionalmente, también puedes almacenar aquí un archivo de base de datos SQLite si prefieres no configurar un motor externo durante el desarrollo local.
La carpeta lang
La carpeta lang alberga todos los archivos de idioma de la aplicación. A partir de Laravel 11, esta carpeta ya no se incluye por defecto; debes publicarla manualmente cuando necesites soporte para múltiples idiomas ejecutando:
$ php artisan lang:publishUna vez publicada, encontrarás subcarpetas para cada idioma (por ejemplo, lang/es y lang/en), cada una con archivos .php o .json que contienen los textos traducibles de la aplicación.
La carpeta public
La carpeta public es el único directorio que debe apuntar el servidor web (Apache, Nginx, etc.). Contiene el archivo index.php, que actúa como punto de entrada para todas las solicitudes HTTP y configura la carga automática de Composer. Además, aquí se almacenan los activos que el navegador puede consumir directamente: imágenes, archivos JavaScript compilados, hojas de estilo CSS, fuentes y cualquier otro recurso estático. En producción, Vite compila y publica los assets en esta carpeta.
La carpeta resources
La carpeta resources contiene los recursos sin compilar de la aplicación. Aquí se ubican las vistas Blade en resources/views, así como los archivos fuente de CSS y JavaScript en resources/css y resources/js respectivamente. Estos archivos son procesados por Vite durante el build y el resultado se publica en la carpeta public. Si usas Vue, React o cualquier otro framework JavaScript, sus componentes también vivirán aquí.
La carpeta routes
La carpeta routes contiene todas las definiciones de rutas de la aplicación. A partir de Laravel 11, la estructura se simplificó y por defecto solo se incluyen dos archivos:
web.php: Contiene las rutas para la aplicación web, es decir, las que se consumen desde el navegador. Estas rutas están configuradas con estado de sesión, protección CSRF y cifrado de cookies.console.php: Aquí puedes definir comandos de consola usandoArtisan::command(), una alternativa ligera a crear clases completas enapp/Console/Commands.
A partir de Laravel 11, los siguientes archivos son opcionales y deben publicarse manualmente:
api.php: Contiene las rutas para construir una API REST. Estas rutas son stateless (sin estado); las solicitudes se autentican mediante tokens, típicamente con Laravel Sanctum. Para publicarlo ejecuta:
$ php artisan install:apiAl ejecutar este comando, Laravel instalará automáticamente Laravel Sanctum como dependencia del proyecto:
./composer.json has been updated
Running composer update laravel/sanctum
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
- Locking laravel/sanctum (v4.X)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
- Downloading laravel/sanctum (v4.X)
- Installing laravel/sanctum (v4.X): Extracting archivechannels.php: Es donde registras los canales de transmisión de eventos (broadcasting) que admite tu aplicación. Para publicarlo ejecuta:
$ php artisan install:broadcastingLa carpeta storage
La carpeta storage es el espacio de almacenamiento interno del framework. Aquí se guardan las plantillas Blade compiladas, sesiones basadas en archivos, cachés, logs de la aplicación y cualquier otro archivo generado en tiempo de ejecución. Está dividida en tres subcarpetas: storage/app para archivos generados por la propia aplicación, storage/framework para archivos internos del framework y storage/logs para los registros de actividad. Para que los archivos subidos por los usuarios sean accesibles desde el navegador, se crea un enlace simbólico con php artisan storage:link, que apunta de public/storage hacia storage/app/public.
La carpeta tests
La carpeta tests contiene las pruebas automatizadas del proyecto. Por defecto, Laravel incluye soporte para PHPUnit y viene preconfigurado para trabajar con Pest, un framework de testing con una sintaxis más expresiva y moderna. Dentro encontrarás dos subcarpetas: tests/Feature para pruebas de integración que simulan peticiones HTTP reales, y tests/Unit para pruebas unitarias de clases y métodos específicos.
La carpeta vendor
La carpeta vendor contiene todas las dependencias del proyecto gestionadas por Composer. Aquí se instala el propio framework de Laravel junto con cualquier paquete de terceros declarado en composer.json. Esta carpeta nunca debe subirse al repositorio; se excluye mediante .gitignore y se regenera en cada entorno ejecutando composer install.
Subcarpetas principales de app
Como mencionamos, la carpeta app es donde concentramos la mayor parte del desarrollo. Veamos sus subcarpetas más importantes:
La carpeta Http
La carpeta Http agrupa todo lo relacionado con la capa de entrada HTTP. Encontrarás los controladores en app/Http/Controllers, el middleware en app/Http/Middleware y los Form Requests en app/Http/Requests. Estos últimos son clases dedicadas a la validación de formularios que mantienen los controladores limpios y enfocados en la lógica de negocio.
La carpeta Models
La carpeta Models contiene todas las clases de modelos de Eloquent, el ORM de Laravel. Cada tabla de la base de datos tiene un modelo correspondiente que sirve como interfaz para interactuar con ella: puedes consultar, insertar, actualizar y eliminar registros usando una sintaxis orientada a objetos sin escribir SQL directamente. Además, los modelos permiten definir relaciones entre tablas (como hasMany, belongsTo, belongsToMany), lo que hace que trabajar con datos relacionados sea especialmente fluido.
El siguiente paso natural es conocer en detalle cómo funcionan las rutas en Laravel.