Link Search Menu Expand Document

5.4. Arquitectura, convenciones y configuración de Laravel

Como cualquier framework, Laravel sigue una serie de convenciones para los identificadores, la estructura de directorios de la aplicación y la configuración.

Aunque no es imprescindible seguir esas convenciones, y puede resultar un poco enojoso las primeras veces (en plan: ¿pero por qué tengo que llamar a esa clase así, si quiero llamarla de otro modo?), a la larga el uso de convenciones ahorra muchísimo tiempo de desarrollo y, sobre todo, de depuración. ¿Cuántas veces no has estado depurando un error consistente en haber olvidado que el nombre de una tabla de la base de datos lo habías escrito en plural y no en singular, o al revés?

“Convención sobre configuración” es un lema de muchos frameworks. Quiere decir que, si seguimos las convenciones del framework, tanto si nos gustan como si no, nos ahorraremos mucho tiempo de discusión sobre la configuración y muchos quebraderos de cabeza posteriormente.

5.4.1. Estructura de directorios

Después de una instalación limpia de Laravel, nos encotraremos con una estructura típica de directorios que hay que respetar.

Los más importantes (al menos, para empezar) son estos:

composer.json: información para composer (ya sabes, el administrador de paquetes de PHP). Sirve para instalar todas las librerías de terceros que Laravel necesita para funcionar. Imprescindible para instalar la aplicación en otro servidor.

/app: el código de nuestra aplicación. Aquí están los modelos.

/app/config: configuración de la aplicación.

/app/http: peticiones HTTP, incluyendo los controladores.

/database: migraciones y seeders de la base de datos. Las migraciones son muy importantes y les dedicaremos un apartado más adelante.

/plugins: pues eso.

/public: directorio de acceso público. Aquí Laravel generará todo lo que hay que mover al servidor para poner la web en producción. Puedes crear aquí dentro carpetas para colocar imágenes, scripts JS o archivos css.

/resources: Aquí dentro están las vistas. También el resto de assets (imágenes, css, js). A diferencia del directorio public, los archivos JS o css que coloquemos aquí estarán precompilados no serán accesibles vía web y, lo que es más importante, podemos crear archivos Less, Sass, JS y varios frameworks JS, y Laravel se encargará de compilarlos automáticamente y generar versiones minimizadas de nuestro CSS y nuestro JS.

De momento, vamos a colocar nuestro CSS y nuestro JS en la carpeta /public. Más adelante puedes trastear con /resources si lo deseas.

/storage: aquí Laravel guarda su memoria caché, información sobre las sesiones, vistas compiladas… No debes tocar esta carpeta para nada.

/vendors: librerías de terceros. Es importante añadir esta carpeta al .gitignore si vas a construir un repositorio git para tu aplicación Laravel, porque /vendors puede ocupar bastante espacio y no tiene sentido incluirla en tu proyecto. Si necesitas desplegar esta aplicación Laravel en otro servidor, basta con clonar el repositorio y ejecutar composer update. Eso rellenará la carpeta /vendor con las librerías más adecuadas para ese servidor.

5.4.2. Convenciones en Laravel

Laravel tiene un montón de convenciones que persiguen hacer más sencilla la configuración de la aplicación y evitar errores tontos que pueden consumir mucho tiempo de depuración.

Aunque la mayoría de estas convenciones no son obligatorias, es recomendable respetarlas para ahorrarte quebraderos de cabeza posteriores.

  • En primer lugar, usa solo identificadores en inglés. Mejor User que Usuario. Así, de paso, practicas un poco el idioma universal de la informática.

  • Modelos: Los nombres de los modelos deben ser iguales a los de las tablas de la base de datos, pero en singular, en CamelCase y con mayúscula.

    Ejemplo: RegisteredUser

  • Controladores: Llámalos como los modelos, pero añadiendo la palabra “controller”.

    Ejempo: RegisteredUserController

  • Métodos: Se nombran en camelCase yt empezando con minúscula.

    Ejemplo: RegisteredUser::getAll()

  • Atributos: Se nombran en en snake_case y empezando con minúscula.

    Ejemplo: RegisteredUser::first_name

  • Variables: Los identificadores deben ir en camelCase y empezando con minúscula. En plural si se trata de una colección y en singular si es un objeto individual o una variable simple.

    Ejemplos: bannedUsers (colección, en plural), articleContent (objeto individual, en sigular)

  • Tablas: Se nombran en plural y en snake_case.

    Ejemplo: registered_users.

  • Columnas de las tablas: Se nombran en snake_case, sin referencia al nombre de la tabla.

    Ejemplo: first_name

    • Clave primaria: La llamaremos id. Siempre. No le des más vueltas. id y punto. El tipo: integer y auto-increment.

    • Claves ajenas: Se forman con el nombre de la tabla ajena en singular más la palabra id. Ejemplo: article_id

    • Timestamps: Laravel siempre crea marcas de tiempo para todo. Y siempre se llaman created_at y updated_at, de tipo datetime. Acostúmbrate a tenerlas en todas tus tablas.

  • Tablas pivote: Son esas tablas horribles formadas como resultado de una relación N:N entre dos tablas maestras. Se nombran en snake_case, en plural y orden alfabético. Ejemplo: articles_users será el pivote entre las tablas articles y users.

5.4.3. Variables de entorno. El archivo .env

En el directorio raíz de toda aplicación hecha con Laravel existe un archivo muy especial llamado .env. Ojo, porque en los sistemas tipo Linux, todos los archivos cuyo nombre empieza por un punto están ocultos. Debes buscar la opción para mostrar los archivos ocultos de tu navegador de archivos si quieres verlo.

Este archivo contiene todas las variables de entorno que configuran la aplicación, como:

  • APP_ENV: En esta variable se indica si la aplicación está en desarrollo o en producción

  • APP_DEBUG: ¿Queremos mostrar los errores para depuración? Se pone a true durante el desarrollo y se cambia a false al pasar a producción.

  • APP_URL: La URL base de la aplicación. Hay que modificarla cuando movemos la aplicación a otro servidor.

  • DB_CONNECTION, DB_HOST, DB_USERNAME, etc. Es decir, la configuración de la conexión a la base de datos.

Una instalación limpia de Laravel vendrá con un archivo llamado example.env, que contiene una plantilla para que puedas construir tu propio archivo .env. Simplemente, renombra el archivo example.env y asigna los valores correctos a las variables de entorno.

Cuidado: el archivo .env NO debe sincronizarse con git (o con el control de versiones que usemos) porque contiene información sensible. Asegúrate de incluirlo en tu .gitignore. Consulta la sección sobre Git de este mismo manual si no sabes como hacerlo.

Una vez creado nuestro archivo .env, podemos usar las variables definidas en él en cualquier otra parte de la aplicación. Por ejemplo, en /config/database.php usaremos una expresión así:

'default' => env('DB_CONNECTION', 'mysql')

El primer parámetro de env() es la variable de entorno que queremos consultar y el segundo es el valor por defecto en caso de que la variable no exista.

5.4.4. Archivos de configuración del directorio /config

En este directorio encontraremos multitud de archivos que configuran el funcionamiento de Laravel.

En principio, no es necesario modificar ninguno, porque las configuraciones básicas se manejan desde el archivo .env. Sin embargo, hay situaciones en las que sí necesitaremos acceder a estos archivos y tocar alguna configuración.

Algunos archivos de configuración importantes que puedes encontrar aquí son:

  • database.php: configuración de la conexión a la base de datos. Toma sus valores principales de .env, pero desde aquí podemos cambiar otras cosas, como el controlador (por defecto es MySQL, pero podemos cambiarlo a PostgreSQL, SQLite, etc).

  • app.php: nombre de la aplicación, estado (desarrollo, producción…).

  • session.php: forma en la que se almacenarán las variables de sesión (por defecto, en un fichero en el servidor).