Estas convenciones siguen el estilo definido por PSR-12, la sucesora de PSR-2 (y que hoy sigue evolucionando como PER Coding Style).
Espero que este artículo sirva de guía recurrente ante cualquier duda.
Base
Antes de comenzar, vamos a refrescar algunos estilos para nombrar ciertos elementos.
Estilos de nombrado
En el mundo de la programación hay muchos estilos que se emplean para reemplazar los espacios ( ) de las palabras a la hora de definir elementos tales como nombres de variables, funciones, clases, codificar URLs, y un largo etc. Algunos de los más utilizados son los siguientes:
camelCase
Este estilo elimina los espacios aplicando una mayúscula para juntar la palabra siguiente. Notar que la primera letra va siempre en minúscula. El nombre viene por la forma de la joroba de un camello /\/\ (camel). Ejemplos:
estoEstaBienEstoNoEsCorrectoesto_tampocoPascalCase
Muy similar al anterior, solo que en este caso la primera letra va en mayúscula. El nombre proviene del lenguaje de programación Pascal. Ejemplos:
EstoEstaBienestoYaNoesto_menossnake_case
En este estilo se reemplazan los espacios por sub-guiones (_) y todo el texto se escribe en minúsculas. Tal como indica su nombre, se le llama así por la similitud con el movimiento de las serpientes. Ejemplos:
esto_esta_bienestoNoEstoMuchoMenosni-hablar-de-este-otrokebab-case
Este estilo es similar al anterior (snake_case), con la única diferencia de que utiliza guiones (-) en lugar de sub-guiones. De este modo el texto toma la forma de una brocheta, de ahí el origen del nombre (kebab). Ejemplos:
ahora-si-me-toco-a-miEstoNoEstaBienestoMuchoMenoseste_se_parece_pero_noupEntonces, a modo de resumen:
- PascalCase
- camelCase
- snake_case
- kebab-case
Estos no son los únicos estilos, de seguro que hay varios más, sin embargo son los que ocuparemos el día de hoy. Ahora sí, pasemos a lo que nos interesa.
Convenciones Laravel
Vamos a agrupar las reglas de nombrado según el tipo de elemento. Como nota general: dado que todo el framework está escrito en inglés, este es el idioma que debes emplear para nombrar tus elementos.
Controladores
Los nombres de los controladores se derivan del nombre del modelo (en singular), añadiendo el sufijo Controller. Se aplica el estilo PascalCase. Veamos algunos ejemplos:
class UserControllerclass OrderDetailControllerclass UsersControllerclass customerControllerclass DetalleDeFacturaControllerclass borrowed-book-controllerFunciones
Las funciones deben ser nombradas aplicando camelCase. Veamos algunos ejemplos:
public function getUser()public function isAdmin()public function orderDetails()public function ThisIsABadExample()public function this_is_also_incorrect()Modelos
Para nombrar a los modelos tomaremos el nombre de la entidad en singular y siempre aplicando PascalCase. Veamos algunos ejemplos:
class Userclass OrderDetailclass Usersclass customerclass DetalleDeFacturaclass borrowed-bookPropiedades de modelos
Los atributos, tanto los recibidos de la base de datos como los computados, deben ser nombrados siguiendo snake_case:
$user->name$order->created_at$invoice->createdAt$book->LaunchDateRelaciones
Las relaciones deben seguir el modo de nombrado de las funciones. Además, sus nombres deben ir en singular o plural dependiendo de la naturaleza de la relación.
Las relaciones de tipo hasMany, belongsToMany y morphMany deben indicarse en plural, pues es lógico que estas tratarán con una colección de elementos:
$continent->countries()$book->authors()$spider->leg()$continent->country()Las relaciones de tipo hasOne, belongsTo y morphTo deben indicarse en singular, pues estas tratan con una única instancia del modelo relacionado:
$phone->owner()$room->house()$house->districts()$line->files()Métodos de los modelos
El resto de métodos del modelo siguen las mismas reglas que una función común: camelCase. Esto se aplica para los accesores y mutadores, los query scopes, etc.
Desde Laravel 9, un accesor o mutador es un solo método que devuelve Attribute y se llama como el atributo, pero en camelCase. El atributo en sí sigue en snake_case:
protected function firstName(): Attribute{ return Attribute::make( get: fn (string $value) => ucfirst($value), );}
$user->first_name;Con los scopes pasa lo mismo: el clásico scopeActive() o, desde Laravel 12, active() con el atributo #[Scope]. En ambos casos se usa como User::active().
Pruebas
Para nombrar los métodos de prueba antepondremos test, y el resto del nombre debe ser una descripción de lo que se prueba. Cuando escribí esto, lo común era usar camelCase (testGetUserOrderHistory()), pero desde Laravel 8 los propios stubs del framework usan snake_case, así que esa es la convención actual. PHPUnit ejecuta ambos siempre que el método empiece con test. Ejemplos:
public function test_get_user_order_history()public function test_create_and_assign_roles_to_a_user()public function getUserOrderHistory()Y si usas Pest, el problema desaparece: el nombre es un string, como en it('returns the user order history').
Rutas
Los sustantivos en las rutas deben indicarse en plural, aplicando kebab-case. Ejemplos:
/customers/23/orders/order-details/7/user/15/orderDetails/7Tablas
Tablas entidad
Las tablas toman el nombre en inglés y en plural de la entidad, aplicando en este caso snake_case. Veamos algunos ejemplos:
usersorder_detailsPaymentinvoicelibrosTablas pivot/pivote
El nombre de las tablas pivote (empleadas en relaciones de muchos a muchos) se deriva de los nombres en singular de las entidades relacionadas, en orden alfabético y empleando snake_case. Ojo con el orden: es permission_user y no user_permission, porque la p va antes que la u. Veamos algunos ejemplos:
permission_usercategory_postuser_permissionUserPermissionpost_categoryColumnas
Las columnas deben ser nombradas aplicando snake_case. Ejemplos:
idcreated_atphone_numbercreatedAtPhoneNumberLlaves primarias y foráneas
Si no se especifica ninguna, Laravel asume por defecto que la llave primaria de la tabla es id.
Las llaves foráneas se nombran como la entidad en singular, añadiendo el sufijo _id. Ejemplos:
post_iduser_idmobile_phone_iduserIdPostIdVariables
Las variables deben ser descriptivas: en plural si guardan una colección y en singular si guardan un solo elemento. Estas deben aplicar el estilo camelCase. Veamos algunos ejemplos:
$admins = User::isAdmin()->get();$activeUser = User::active()->first();$room = Room::all();$invoices = Order::find(1)->invoice;Vistas
Para nombrar a las vistas en Blade se aplica kebab-case. Estas vistas deben terminar en .blade.php. Ejemplos:
footer.blade.phpactive-user.blade.phpcreate-admin.blade.phpactive_user.blade.phpcreateAdmin.blade.phpCierre
Estas son las recomendaciones y los estilos que emplean Laravel y el resto de su comunidad para nombrar los elementos. Puedes estar de acuerdo o no, es normal, pues al final de cuentas son recomendaciones. Por ejemplo, yo siempre preferí snake_case para nombrar las funciones de mis pruebas porque siento que facilita la lectura (y con el tiempo Laravel terminó pensando lo mismo), pero hey, todos tienen sus manías.
En fin, de todos modos siempre es bueno tener esto presente para saber cómo es que se estila. Espero te sirva.
PD: Iré añadiendo más elementos a medida que los note en mi código. Si conoces algún elemento que no aparece en la lista, por favor házmelo saber.