abordar el proyecto:Tutorial CRUD con Laravel 12-Pastel::factory(50)->create();
Tu pregunta es clave: ¿cómo estructurar el pensamiento antes de teclear un solo comando? No se trata solo de memorizar php artisan make:..., sino de tener un flujo mental que te permita abordar cualquier proyecto (tienda, blog, inventario, etc.) con claridad.
Te voy a dar una guía paso a paso para que cada vez que tengas una nueva entidad (objeto) sepas exactamente qué hacer, en qué orden y por qué.
1. Fase de análisis: entender el objeto (antes del código)
Antes de abrir la terminal, respóndete estas preguntas:
¿Cuál es la entidad principal?
Ej: Pastel, Producto, Usuario, Pedido, Libro…Nombre en singular (para modelo y controlador):
PastelNombre en plural (para tabla y ruta):
pasteles(convención: tabla en plural y snake_case)
¿Qué atributos tiene?
Haz una lista con su tipo de dato (string, integer, decimal, boolean, text, date, etc.).
Ej:nombre(string),precio(decimal),disponible(boolean),descripcion(text),sabor(enum).¿Qué validaciones necesitas?
(requerido, único, formato, tamaño, etc.) – Esto te servirá para elFormRequesto la validación en el controlador.¿Tiene relaciones con otras tablas?
(pertenece a, tiene muchos, etc.) – Esto define claves foráneas en la migración (foreignId,constrained).¿Qué operaciones CRUD necesitas?
¿Todo el CRUD (crear, leer, actualizar, eliminar) o solo algunas (ej: solo lectura para usuarios invitados)?¿Quién usará esto?
(admin, cliente, invitado) – Define si necesitas autenticación, permisos, etc.
2. Flujo de creación (orden lógico de ejecución)
Una vez que tienes claras las respuestas, este es el orden recomendado:
Paso 1 – Crear la migración (la estructura de la tabla)
php artisan make:migration create_pasteles_tableDefine todas las columnas que identificaste en el análisis.
Usa tipos modernos:
$table->id(),$table->softDeletes()si quieres borrado lógico,foreignId()para relaciones.
Paso 2 – Crear el modelo (la lógica de la entidad)
php artisan make:model Pastel(Si quieres ahorrar pasos, puedes hacer todo junto: php artisan make:model Pastel -m -c -r -f -s → crea migración, controlador resource, factory y seeder).
Define
$fillableo$guarded(seguridad).Agrega
use SoftDeletessi lo usaste en la migración.Define
$castspara conversión de tipos.Opcional: scopes, accesors, mutators.
Paso 3 – Crear el controlador (la lógica de negocio)
php artisan make:controller PastelController --resourceEste comando crea los 7 métodos (index, create, store, show, edit, update, destroy).
Si usas API, usa
--api(omite create y edit).Dentro de cada método escribe la lógica:
index: obtener datos (con paginación, filtros, etc.) y retornar vista o JSON.store/update: validar datos (puedes usar FormRequest) y guardar.destroy: eliminar (físico o lógico).
Paso 4 – Definir las rutas (accesos públicos)
En routes/web.php:
use App\Http\Controllers\PastelController;
Route::resource('pasteles', PastelController::class);Esa única línea genera todas las rutas CRUD con sus nombres (.index, .create, etc.).
Si necesitas rutas adicionales (como restore para soft delete), agrégalas aparte con un grupo.
Paso 5 – Crear las vistas (la interfaz de usuario)
Laravel no tiene un comando nativo para crear vistas blade.
Crea manualmente los archivos en
resources/views/pasteles/:index.blade.php(listado)create.blade.php(formulario de creación)edit.blade.php(formulario de edición)show.blade.php(detalle)
Usa un layout común (
layouts/app.blade.php) para no repetir HTML.
Paso 6 – Crear Factory y Seeder (datos de prueba)
php artisan make:factory PastelFactory --model=Pastel
php artisan make:seeder PastelSeederEn el factory, define cómo generar datos falsos con Faker.
En el seeder, usa
Pastel::factory(50)->create().Registra el seeder en
DatabaseSeeder.phpy luego ejecutaphp artisan migrate --seed.
3. Plantilla mental (el "esqueleto" para cualquier objeto)
Cuando empieces un nuevo objeto, mentalmente repite esta secuencia:
Objeto:
Pastel(singular) → tablapasteles(plural)Campos: nombre, sabor, precio, disponible, descripción
Comando inicial:
php artisan make:model Pastel -mcrf(modelo, migración, controlador resource y factory)Editar migración: agregar los campos con sus tipos
Editar modelo: agregar
$fillabley$castsEditar controlador: escribir validación y lógica (o usar FormRequest)
Editar rutas:
Route::resource('pasteles', PastelController::class)Crear vistas: archivos blade para index, create, edit, show
Crear factory/seeder: para datos de prueba
Ejecutar:
php artisan migrate --seedyphp artisan serve
4. Ejemplo concreto: si tuvieras que hacer un CRUD de "Libros"
Objeto:
Libro(singular) → tablalibrosCampos:
titulo,autor,isbn,precio,stock,publicado_en(date)Comandos:
php artisan make:model Libro -mcrfMigración: agregar columnas
Modelo:
$fillable = ['titulo','autor','isbn','precio','stock','publicado_en'];Controlador: validar y guardar
Ruta:
Route::resource('libros', LibroController::class);Vistas:
libros/index,libros/create,libros/edit,libros/showSeeder:
Libro::factory(30)->create()
5. Consejos para no perderte
Siempre piensa en singular/plural: modelo en singular, tabla en plural, ruta en plural.
Usa
Route::resourcepara ahorrar código (genera las 7 rutas automáticamente).Usa
php artisan make:model -mcrfpara crear todo de una vez (modelo, migración, controlador resource, factory). Luego solo editas los archivos generados.No olvides los mensajes flash (
with('success', '...')) para dar feedback al usuario.Prueba siempre con
php artisan route:listpara verificar que tus rutas están bien.
Con esta estructura de pensamiento, cualquier proyecto nuevo lo encaras con la misma metodología: analizar → crear migración → modelo → controlador → rutas → vistas → datos de prueba.
El resto (relaciones, autenticación, permisos) se añade cuando lo necesites, pero el esqueleto base es siempre el mismo.
Regla General para Variables en PHP (dentro de Controladores y Vistas)
Todas las variables en PHP van en camelCase (primera letra minúscula, siguientes palabras con mayúscula).
✅ Correcto:
$pastelFavorito,$precioTotal,$nombreCompleto❌ Incorrecto:
$pastel_favorito(eso essnake_case, se usa para columnas),$PastelFavorito(eso esPascalCase, se usa para clases).
Regla de Singular vs. Plural (La más importante en Laravel)
La decisión de usar singular o plural depende de cuántos elementos representa la variable:
| Contexto | ¿Qué representa? | Regla | Ejemplo (Pastel) |
|---|---|---|---|
| Variable dentro del controlador | Un solo registro | Singular | $pastel = Pastel::find(1); |
| Variable dentro del controlador | Una lista de registros | Plural | $pasteles = Pastel::all(); |
| Parámetro en la ruta (URL) | Un solo registro (inyección de modelo) | Singular | Route::get('/pasteles/{pastel}', ...) |
| Variable enviada a la vista | Lista de registros | Plural | return view('index', compact('pasteles')); |
| Variable en la vista (foreach) | Un elemento individual dentro del bucle | Singular | @foreach($pasteles as $pastel) |
Tabla Comparativa por Capas (Tu "Guía Rápida")
Aquí tienes cómo debes nombrar todo según la capa de Laravel donde estés:
| Capa / Elemento | Convención | Ejemplo | ¿Por qué? |
|---|---|---|---|
| Clase del Modelo | PascalCase (Singular) | class Pastel | Representa una entidad única. |
| Tabla en BD | snake_case (Plural) | pasteles | Laravel asume plural para la tabla. |
| Columnas de la BD | snake_case (Singular) | nombre, created_at | Estándar SQL. |
| Controlador | PascalCase (Singular) + Controller | PastelController | Nombrado por la entidad que gestiona. |
| Ruta (URI) | snake_case o kebab-case (Plural) | /pasteles o /lista-pasteles | Es la URL pública, se usa plural. |
| Parámetro de Ruta (Model Binding) | snake_case (Singular) | {pastel} | Laravel lo usa para buscar UN modelo. |
| Nombre de la Ruta (name) | snake_case con puntos (Singular/Plural según método) | pasteles.index, pasteles.create | Convención del framework. |
| Variable en Controller (1 item) | camelCase (Singular) | $pastel | Es un objeto único. |
| Variable en Controller (varios) | camelCase (Plural) | $pasteles | Es una colección de objetos. |
Relación belongsTo / hasOne | camelCase (Singular) | public function categoria() | Devuelve UN modelo. |
Relación hasMany / belongsToMany | camelCase (Plural) | public function ingredientes() | Devuelve UNA colección. |
| Factory | PascalCase (Singular) + Factory | PastelFactory | Fabrica instancias del modelo. |
| Seeder | PascalCase (Singular) + Seeder | PastelSeeder | Siembra datos de ese modelo. |
Errores Comunes que debes evitar
Poner la tabla en singular
❌Schema::create('pastel', ...)
✅Schema::create('pasteles', ...)
Laravel infiere el nombre de la tabla a partir del modelo en plural. Si no lo haces, tendrás que usarprotected $table = 'pastel';en el modelo.Poner el parámetro de ruta en plural
❌Route::get('/pasteles/{pasteles}', ...)
✅Route::get('/pasteles/{pastel}', ...)
Si pones{pasteles}, Laravel buscará una variable llamada así en el controlador, pero la inyección de modelos funciona con el nombre singular.Usar
snake_caseen variables PHP
❌$pastel_favorito = ...
✅$pastelFavorito = ...
PHP usasnake_casepara constantes y nombres de funciones internas, pero para variables propias se usacamelCase.Confundir el nombre del modelo con la tabla
❌ Modelo:Pasteles(plural)
✅ Modelo:Pastel(singular).
El modelo siempre es singular porque representa una instancia (un pastel).
Resumen Ejecutivo (Para que lo imprimas y lo tengas a mano)
Variables PHP (dentro del código):
camelCase
Si es UN objeto: singular ($pastel,$usuario,$producto)
Si es VARIOS objetos: plural ($pasteles,$usuarios,$productos)
Tablas y columnas:snake_case(tablas en plural, columnas en singular)
Clases y Controladores:PascalCase(singular)
Rutas URL: plural (/pasteles)
Parámetro de ruta: singular ({pastel})
Con esto, cuando empieces un nuevo proyecto, ya sabrás instintivamente:
El modelo se llama
Producto.La tabla se llama
productos.La variable para guardar uno es
$producto.La variable para el listado es
$productos.La ruta es
/productosy el parámetro es{producto}.
¡Así de sencillo y sistemático! ¿Necesitas que profundice en cómo nombrar las relaciones (por ejemplo, pastelCategoria vs categoriaPastel)?
Comentarios
Publicar un comentario