====== Convenciones utilizadas en Laravel ======
[[informatica:programacion:php:frameworks:laravel|Laravel]] prioriza "convención sobre configuración", así que seguir sus estándares te ahorrará tiempo.
===== Estructura de directorios =====
* ''app/Models'': modelos
* ''resources/views'': vistas.
* ''app/Http/Controllers'': controladores.
* ''database/migrations'': migraciones.
* ''routes'': definición de rutas.
* ''config'': archivos de configuración.
===== Nombrado de ficheros =====
* **Modelos**: Singular y //PascalCase// (ej: ''User'', ''ProductCategory'').
* ** Controladores**: Sufijo //Controller// (ej: ''UserController'').
* **Migraciones**: ''create_users_table'' → genera tabla ''users''.
===== Bases de datos =====
==== Nombres de tablas ====
Por defecto, Laravel asume que el nombre de la tabla corresponde al **plural en inglés** del modelo asociado, en //snake_case// (minúsculas y separado por guiones bajos) si tiene más de una palabra.
Ejemplos:
^ Modelo ^ Tabla ^
| ''User'' | ''users'' |
| ''PostComment'' | ''post_comments'' |
| ''ProductCategory'' | ''product_categories'' |
Si nuestras tablas no siguen esta regla, podemos definir el nombre manualmente en el modelo estableciendo una propiedad privada con el nombre de la tabla:
class User extends Model {
protected $table = 'mis_usuarios'; // Sobrescribe la convención
}
==== Tablas Pivote ====
Para relaciones muchos a muchos (//Many-to-Many//), Laravel espera una tabla intermedia (**pivote**) con los nombres de las dos tablas relacionadas **en orden alfabético**, en singular y unidos por un guion bajo.
Por ejemplo:
^ Modelos ^ Tabla pivote ^
| ''User'' y ''Role'' | ''role_user'' |
| ''Post'' y ''Tag'' | ''post_tag'' |
==== Claves primarias ====
Por defecto, Laravel espera una columna llamada ''id'' como clave primaria.
Si nuestra tabla usa otro nombre como clave primaria, hay que definir una propiedad //protected// ''$primaryKey'' en el modelo correspondiente:
class User extends Model {
protected $primaryKey = 'user_id';
}
==== Claves foráneas ====
Laravel asume que la clave foránea se llama ''nombre_modelo_en_singular_id'' en //snake_case//.
Por ejemplo, si un ''Comment'' pertenece a un ''Post'', la clave foránea será ''post_id''
Si queremos personalizarlo, podemos hacerlo en las relaciones:
class Comment extends Model {
public function post() {
return $this->belongsTo(Post::class, 'mi_post_id'); // Clave foránea personalizada
}
}
==== Timestamps automáticos ====
Laravel espera columnas ''created_at'' y ''updated_at'' en tus tablas para gestionar fechas automáticamente.
Si no las usas, podemos indicarlo en el modelo:
class User extends Model {
public $timestamps = false;
}
==== Columnas en Snake Case ====
Todas las columnas de la base de datos deben definirse en //snake_case// para que Eloquent las mapee correctamente a propiedades en //camelCase// en los modelos.
Por ejemplo, la columna ''published_at'' corresponde a la propiedad del modelo ''Post'' ''$post->published_at''.
===== ¿Qué pasa si no sigo las convenciones? =====
Puedes personalizar todo, pero tendrás que escribir más código (ej: definir manualmente claves foráneas, nombres de tablas, etc.). Seguir las convenciones ahorra tiempo y evita errores.