Artisan
Comandos comunes
php artisan serveIniciar servidor de desarrollo
php artisan make:model Name -mCrear modelo con migración
php artisan make:controller NameControllerCrear clase de controlador
php artisan make:middleware NameCrear clase de middleware
php artisan migrateEjecutar migraciones pendientes
php artisan migrate:rollbackRevertir el último lote de migraciones
php artisan db:seedEjecutar seeders de base de datos
php artisan tinkerREPL interactivo para la aplicación
php artisan route:listListar todas las rutas registradas
php artisan cache:clearLimpiar la caché de la aplicación
php artisan config:clearLimpiar la configuración en caché
php artisan queue:workIniciar el procesamiento de jobs en cola
Rutas
Rutas básicas
Route::get('/users', [UserController::class, 'index']); Route::post('/users', [UserController::class, 'store']); Route::put('/users/{id}', [UserController::class, 'update']); Route::delete('/users/{id}', [UserController::class, 'destroy']);
Parámetros y grupos de rutas
Route::get('/user/{id}', function (int $id) { return User::findOrFail($id); }); Route::prefix('api')->middleware('auth')->group(function () { Route::get('/profile', [ProfileController::class, 'show']); });
Características de rutas
->name('route.name')Ruta nombrada para generación de URL
->where('id', '[0-9]+')Restricción de regex en el parámetro
Route::resource()Rutas de recurso RESTful (7 rutas)
Route::apiResource()Recurso API (sin vistas create/edit)
Route::fallback()Captura todas las rutas no coincidentes
Controladores
Controlador de recurso
class PostController extends Controller { public function index() { return view('posts.index', ['posts' => Post::all()]); } public function store(Request $request) { $validated = $request->validate(['title' => 'required|max:255']); Post::create($validated); return redirect()->route('posts.index'); } }
Métodos de recurso
index()GET /resource -- listar todos
create()GET /resource/create -- mostrar formulario
store()POST /resource -- guardar nuevo
show($id)GET /resource/{id} -- mostrar uno
edit($id)GET /resource/{id}/edit -- formulario de edición
update($id)PUT /resource/{id} -- actualizar
destroy($id)DELETE /resource/{id} -- eliminar
Plantillas Blade
Layout y secciones
{{-- layouts/app.blade.php --}} @yield('content') {{-- pages/home.blade.php --}} @extends('layouts.app') @section('content')

Home

@endsection
Directivas
{{ $var }}Imprimir con escape HTML
{!! $html !!}Imprimir sin escape (raw)
@if / @elseif / @elseBloques condicionales
@foreach ($items as $item)Iterar sobre colección
@forelse / @emptyBucle con alternativa vacía
@include('partial')Incluir otra vista Blade
@component / @slotComponentes Blade reutilizables
@csrfCampo oculto con token CSRF
@auth / @guestVerificar estado de autenticación
@error('field')Mostrar error de validación
Eloquent ORM
Fundamentos del modelo
class Post extends Model { protected $fillable = ['title', 'body', 'user_id']; public function user() { return $this->belongsTo(User::class); } }
Consultas
Post::all(); // all records Post::find(1); // by primary key Post::where('status', 'published')->get(); Post::where('views', '>', 100)->orderBy('created_at', 'desc')->first();
Operaciones CRUD
$post = Post::create(['title' => 'New', 'body' => '...']); $post->update(['title' => 'Updated']); $post->delete(); Post::destroy([1, 2, 3]); // delete by IDs
Relaciones
hasOneUno a uno (Usuario -> Teléfono)
hasManyUno a muchos (Post -> Comentarios)
belongsToInverso de hasOne/hasMany
belongsToManyMuchos a muchos con tabla pivot
hasManyThroughHas-many a través de modelo intermedio
Migraciones
Crear tablas
Schema::create('posts', function (Blueprint $table) { $table->id(); $table->foreignId('user_id')->constrained()->cascadeOnDelete(); $table->string('title'); $table->text('body')->nullable(); $table->timestamps(); });
Tipos de columna
$table->id()Clave primaria BIGINT autoincremental
$table->string('col', 100)VARCHAR con longitud opcional
$table->text('col')Columna TEXT
$table->integer('col')Columna INTEGER
$table->boolean('col')Columna BOOLEAN
$table->json('col')Columna JSON
$table->timestamp('col')Columna TIMESTAMP
$table->timestamps()created_at y updated_at
$table->softDeletes()deleted_at para eliminación suave
Middleware
Middleware personalizado
class EnsureAdmin { public function handle(Request $request, Closure $next) { if (! $request->user()?->is_admin) { abort(403); } return $next($request); } }
Registrar y usar
// bootstrap/app.php ->withMiddleware(function (Middleware $middleware) { $middleware->alias(['admin' => EnsureAdmin::class]); }) // In routes Route::get('/admin', fn() => '...')->middleware('admin');
Middleware integrado
authRequerir autenticación
guestRedirigir si está autenticado
throttle:60,1Límite de velocidad (60 req/min)
verifiedRequerir verificación de email
signedValidar URL firmada
Autenticación
Helpers de Auth
Auth::check(); // is user logged in? Auth::user(); // current User model Auth::id(); // current user ID Auth::attempt(['email' => $e, 'password' => $p]); Auth::logout();
Kits de inicio
Laravel BreezeAutenticación mínima (Blade o Inertia)
Laravel JetstreamCompleto (equipos, 2FA, tokens API)
SanctumAutenticación por token para SPA / móvil
PassportImplementación completa de servidor OAuth2
Proteger rutas
Route::middleware('auth')->group(function () { Route::get('/dashboard', [DashController::class, 'index']); });
Validación
Validación en el controlador
$validated = $request->validate([ 'title' => 'required|string|max:255', 'email' => 'required|email|unique:users', 'age' => 'nullable|integer|min:0', ]);
Form Request
class StorePostRequest extends FormRequest { public function rules(): array { return [ 'title' => 'required|max:255', 'body' => 'required|min:10', ]; } }
Reglas comunes
requiredEl campo debe estar presente y no vacío
string | integer | booleanValidación de tipo
min:N | max:NLongitud o valor mínimo/máximo
emailFormato de email válido
unique:table,columnDebe ser único en la tabla de BD
exists:table,columnDebe existir en la tabla de BD
in:a,b,cDebe ser uno de los valores listados
confirmedRequiere campo _confirmation coincidente
date | after:dateValidación de fecha
Patrones comunes
Respuesta de API
return response()->json(['data' => $users], 200); return response()->json(['error' => 'Not found'], 404);
Entorno y configuración
env('APP_KEY'); // read .env value config('app.name'); // read config value config(['app.debug' => true]); // set at runtime
Helpers útiles
route('name', $params)Generar URL para ruta nombrada
redirect()->route('name')Redirigir a ruta nombrada
back()->withErrors()Redirigir atrás con errores de validación
abort(404)Lanzar excepción HTTP
collect($array)Crear una Collection desde un array
now()Fecha y hora actual de Carbon
cache()->remember()Cachear un valor con TTL