2-Te explico las convenciones de nomenclatura en Laravel:
Controladores
Nombres de Clases (Controladores)
Caso: PascalCase
Sufijo:
ControllerEjemplos:
UserController✅ProductCategoryController✅Estructura: Sujeto/Objeto (Sustantivo) + Controller
user_controller❌
Convención RESTful
// Controlador para manejar productos
class ProductController extends Controller
{
public function index() {} // GET /products
public function create() {} // GET /products/create
public function store() {} // POST /products
public function show() {} // GET /products/{id}
public function edit() {} // GET /products/{id}/edit
public function update() {} // PUT/PATCH /products/{id}
public function destroy() {} // DELETE /products/{id}
}🔧 Métodos
Nombres de Métodos
Caso: camelCase
Verbo + Sustantivo: Primero el verbo, luego el sustantivo
Ejemplos:
getUserProfile()✅updateProductPrice()✅calculateTotal()✅UserProfileGet()❌
Métodos RESTful Comunes
public function index() {} // Listar recursos
public function create() {} // Mostrar formulario de creación
public function store() {} // Guardar nuevo recurso
public function show() {} // Mostrar recurso específico
public function edit() {} // Mostrar formulario de edición
public function update() {} // Actualizar recurso
public function destroy() {} // Eliminar recurso🗃️ Modelos
Nombres de Modelos
Caso: PascalCase
Singular: Siempre en singular
Ejemplos:
User✅ (tabla:users)Product✅ (tabla:products)Category✅ (tabla:categories)Users❌
Relación con Tablas
class User extends Model
{
// Por defecto busca la tabla 'users'
protected $table = 'users'; // Opcional si sigue convención
}
class Product extends Model
{
// Buscará automáticamente la tabla 'products'
}📊 Variables
Variables Regulares
Caso: camelCase
Ejemplos:
$userName✅$productList✅$totalAmount✅$user_name❌ (aunque funciona, no sigue convención)
Colecciones y Arrays
$users = User::all(); // Colección de usuarios
$user = User::first(); // Usuario individual
$productCategories = []; // Array de categorías
$activeProducts = Product::where('active', true)->get();📋 Resumen de Reglas
| Elemento | Caso | Singular/Plural | Ejemplo |
|---|---|---|---|
| Controladores | PascalCase | Plural + Controller | UsersController |
| Modelos | PascalCase | Singular | User |
| Métodos | camelCase | - | getUserData() |
| Variables | camelCase | Depende del contexto | $userName |
| Tablas BD | snake_case | Plural | user_profiles |
| Columnas BD | snake_case | - | created_at |
🎯 Buenas Prácticas
1. Controladores por Recurso
// ✅ Correcto
php artisan make:controller ProductController --resource
// ❌ Evitar controladores que hagan de todo
php artisan make:controller MainController2. Nombres Descriptivos
// ✅ Bueno
public function calculateOrderTotal() {}
public function sendWelcomeEmail() {}
// ❌ Malo
public function doSomething() {}
public function process() {}3. Rutas RESTful
// ✅ Convención estándar
Route::resource('products', ProductController::class);
// ✅ Rutas personalizadas con nombres claros
Route::post('products/{id}/activate', [ProductController::class, 'activate'])
->name('products.activate');🔄 Relaciones con Tablas
La magia de Eloquent funciona con estas convenciones:
Modelo:
User(singular)Tabla:
users(plural)Clave primaria:
idClaves foráneas:
user_id,post_id
// Si necesitas personalizar
class User extends Model
{
protected $table = 'mi_tabla_usuarios'; // Solo si no sigue convención
protected $primaryKey = 'user_id'; // Solo si no es 'id'
}Seguir estas convenciones hace tu código más legible y mantenible, y aprovecha todas las funcionalidades automáticas de Laravel.
Te explico las convenciones de nomenclatura en Laravel con énfasis en la estructura Verbo + Sustantivo:
📝 Controladores
Nombres de Clases (Controladores)
Caso: PascalCase
Estructura: Sustantivo (Plural) + Controller
Sufijo:
ControllerEjemplos:
UserController(Maneja usuarios) ✅ProductController(Maneja productos) ✅OrderController(Maneja órdenes) ✅
Convención RESTful (Métodos)
class ProductController extends Controller
{
// VERBO: Listar | SUSTANTIVO: Productos
public function index() {} // GET /products
// VERBO: Crear | SUSTANTIVO: Formulario de producto
public function create() {} // GET /products/create
// VERBO: Almacenar | SUSTANTIVO: Producto
public function store() {} // POST /products
// VERBO: Mostrar | SUSTANTIVO: Producto específico
public function show() {} // GET /products/{id}
// VERBO: Editar | SUSTANTIVO: Formulario de producto
public function edit() {} // GET /products/{id}/edit
// VERBO: Actualizar | SUSTANTIVO: Producto
public function update() {} // PUT/PATCH /products/{id}
// VERBO: Destruir | SUSTANTIVO: Producto
public function destroy() {} // DELETE /products/{id}
}🔧 Métodos Personalizados
Estructura: VERBO + SUSTANTIVO
Orden: Primero el verbo, luego el sustantivo
Caso: camelCase
Ejemplos:
// ✅ CORRECTO: Verbo primero, luego sustantivo
public function getUserProfile() {} // Obtener perfil de usuario
public function updateProductPrice() {} // Actualizar precio de producto
public function calculateOrderTotal() {} // Calcular total de orden
public function sendWelcomeEmail() {} // Enviar email de bienvenida
public function generateSalesReport() {} // Generar reporte de ventas
public function activateUserAccount() {} // Activar cuenta de usuario
// ❌ INCORRECTO: Sustantivo primero
public function userProfileGet() {} // ❌
public function productPriceUpdate() {} // ❌
public function orderTotalCalculate() {} // ❌🗃️ Modelos
Nombres de Modelos
Caso: PascalCase
Estructura: Sustantivo en Singular
Ejemplos:
User(Modelo para usuario) ✅Product(Modelo para producto) ✅Category(Modelo para categoría) ✅
// VERBO: Definir | SUSTANTIVO: Modelo de Usuario
class User extends Model
{
// VERBO: Obtener | SUSTANTIVO: Posts del usuario
public function getUsersPosts() {}
// VERBO: Calcular | SUSTANTIVO: Edad del usuario
public function calculateUserAge() {}
}📊 Variables
Variables y Propiedades
Caso: camelCase
Estructura: Sustantivo descriptivo (a veces con adjetivo)
Ejemplos:
// ✅ Variables con sustantivos descriptivos
$userName = 'John'; // Nombre de usuario
$productList = []; // Lista de productos
$totalAmount = 100; // Monto total
$isActiveUser = true; // Usuario activo
$hasValidSubscription = false; // Tiene suscripción válida
// ✅ Colecciones (sustantivo en plural)
$activeUsers = User::where('active', true)->get(); // Usuarios activos
$productCategories = Category::all(); // Categorías de productos📋 Resumen Completo de Reglas
| Elemento | Caso | Estructura | Singular/Plural | Ejemplo |
|---|---|---|---|---|
| Controladores | PascalCase | Sustantivo + Controller | Plural | UsersController |
| Métodos REST | camelCase | Verbo | - | store(), update() |
| Métodos Personalizados | camelCase | Verbo + Sustantivo | - | calculateTotal() |
| Modelos | PascalCase | Sustantivo | Singular | User, Product |
| Variables | camelCase | Sustantivo | Depende contexto | $userName, $products |
| Tablas BD | snake_case | Sustantivo | Plural | users, product_categories |
| Columnas BD | snake_case | Sustantivo | - | created_at, price |
🎯 Ejemplos Prácticos Completos
Controlador con Métodos Personalizados
class OrderController extends Controller
{
// ✅ VERBO + SUSTANTIVO: Calcular total de orden
public function calculateOrderTotal($orderId)
{
$order = Order::find($orderId);
$total = $order->calculateTotal();
return response()->json(['total' => $total]);
}
// ✅ VERBO + SUSTANTIVO: Aplicar descuento a orden
public function applyOrderDiscount($orderId, $discount)
{
$order = Order::find($orderId);
$order->applyDiscount($discount);
return response()->json(['success' => true]);
}
// ✅ VERBO + SUSTANTIVO: Generar factura de orden
public function generateOrderInvoice($orderId)
{
$invoice = Order::generateInvoice($orderId);
return response()->download($invoice);
}
}Modelo con Métodos
class User extends Model
{
// ✅ VERBO + SUSTANTIVO: Verificar contraseña de usuario
public function verifyUserPassword($password)
{
return Hash::check($password, $this->password);
}
// ✅ VERBO + SUSTANTIVO: Actualizar perfil de usuario
public function updateUserProfile($data)
{
$this->update($data);
return $this;
}
// ✅ VERBO + SUSTANTIVO: Calcular edad de usuario
public function calculateUserAge()
{
return now()->diffInYears($this->birthdate);
}
}🔄 Rutas con Convenciones
// Rutas RESTful automáticas
Route::resource('products', ProductController::class);
// Rutas personalizadas con nombres VERBO + SUSTANTIVO
Route::post('products/{id}/activate', [ProductController::class, 'activateProduct'])
->name('products.activate'); // activateProduct = VERBO + SUSTANTIVO
Route::get('users/{id}/reports', [UserController::class, 'generateUserReport'])
->name('users.generateReport'); // generateUserReport = VERBO + SUSTANTIVOEsta estructura Verbo + Sustantivo hace que el código sea:
Más legible: Se entiende inmediatamente qué acción realiza cada método
Más mantenible: Nombres consistentes y predecibles
Más intuitivo: Sigue el flujo natural de lenguaje (acción + objeto
Tienes toda la razón. Permíteme corregir y explicar adecuadamente la estructura para controladores:
📝 Controladores - Estructura Correcta
Nombres de Clases (Controladores)
Caso: PascalCase
Estructura: Sujeto/Objeto (Sustantivo) + Controller
Sufijo:
ControllerNúmero: Sustantivo en Plural (representa la colección que maneja)
✅ Ejemplos Correctos:
// Controlador para manejar usuarios (colección de usuarios)
class UsersController extends Controller {} // Sujeto: Users
// Controlador para manejar productos (colección de productos)
class ProductsController extends Controller {} // Sujeto: Products
// Controlador para categorías de productos
class ProductCategoriesController extends Controller {} // Sujeto: ProductCategories❌ Ejemplos Incorrectos:
class UserController extends Controller {} // ❌ Debe ser plural: UsersController
class ManageUsersController extends Controller {} // ❌ No sigue estructura Sustantivo + Controller
class user_controller extends Controller {} // ❌ Caso incorrecto🔧 Métodos - Estructura Correcta
Métodos RESTful Estándar:
class ProductsController extends Controller
{
// SUJETO: Products | VERBO: index (listar)
public function index() {} // GET /products
// SUJETO: Product | VERBO: create (mostrar formulario creación)
public function create() {} // GET /products/create
// SUJETO: Product | VERBO: store (almacenar)
public function store() {} // POST /products
// SUJETO: Product | VERBO: show (mostrar)
public function show() {} // GET /products/{id}
// SUJETO: Product | VERBO: edit (mostrar formulario edición)
public function edit() {} // GET /products/{id}/edit
// SUJETO: Product | VERBO: update (actualizar)
public function update() {} // PUT/PATCH /products/{id}
// SUJETO: Product | VERBO: destroy (eliminar)
public function destroy() {} // DELETE /products/{id}
}Métodos Personalizados:
class UsersController extends Controller
{
// SUJETO: User | VERBO: activate (activar)
public function activate() {} // PUT /users/{id}/activate
// SUJETO: User | VERBO: suspend (suspender)
public function suspend() {} // PUT /users/{id}/suspend
// SUJETO: UserProfile | VERBO: update (actualizar)
public function updateProfile() {} // PUT /users/{id}/profile
// SUJETO: UserPassword | VERBO: change (cambiar)
public function changePassword() {} // PUT /users/{id}/password
}🎯 Estructura Generalizada
Para Controladores:
[SUSTANTIVO_PLURAL] + ControllerSustantivo: Representa el recurso/entidad que se manipula
Plural: Indica que maneja una colección del recurso
Controller: Identifica el tipo de clase
Para Métodos:
[VERBO] + [SUSTANTIVO_OPCIONAL]()Verbo: La acción a realizar (index, create, store, show, edit, update, destroy)
Sustantivo: Opcional, para especificar sub-recursos (profile, password, settings)
📋 Resumen Corregido
| Elemento | Estructura | Ejemplo | Explicación |
|---|---|---|---|
| Controlador | Sustantivo Plural + Controller | UsersController | Maneja colección de usuarios |
| Método REST | Verbo | index(), store() | Acción sobre el recurso principal |
| Método Personalizado | Verbo + Sustantivo | activate(), updateProfile() | Acción específica o sobre sub-recurso |
| Modelo | Sustantivo Singular | User | Representa una instancia única |
| Tabla BD | Sustantivo Plural snake_case | users | Almacena múltiples instancias |
🔄 Relación entre Componentes
Modelo: User (singular) → Instancia individual
Tabla: users (plural) → Colección de instancias
Controlador: UsersController → Maneja la colección
Métodos: index(), show(), etc. → Operaciones sobre la colecciónEsta estructura sigue el principio de que el controlador maneja colecciones de recursos, por eso el sustantivo va en plural, mientras que los métodos operan sobre elementos individuales o la colección completa.
Comentarios
Publicar un comentario