🍃 Laravel Desde Cero - Guía Completa

Aprende Laravel desde los fundamentos hasta conceptos avanzados

"Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience."
Explorar Temas

📖 Temas del Curso

Haz clic en cualquier tema para ver el contenido detallado

📌 Introducción a Laravel

¿Qué es Laravel? Laravel es un framework de código abierto para PHP creado por Taylor Otwell en 2011. Sigue el patrón de diseño Modelo-Vista-Controlador (MVC) y ofrece una sintaxis expresiva y elegante.

Características principales:

  • Eloquent ORM: Sistema de base de datos activo para trabajar con datos.
  • Blade Template: Motor de plantillas ligero y potente.
  • Artisan CLI: Herramienta de línea de comandos integrada.
  • Middleware: Filtrado de peticiones HTTP.
  • Autenticación: Sistema de auth listo para usar.
  • Enrutamiento: Sistema de rutas flexible y expresivo.
  • Colas: Gestión de tareas en segundo plano.
  • Testing: Soporte integrado para pruebas unitarias.

Arquitectura MVC:

  • Modelo: Gestiona la lógica de datos y negocio.
  • Vista: Presenta los datos al usuario.
  • Controlador: Maneja las peticiones y coordina modelo y vista.

Versiones de Laravel:

Versión Lanzamiento Soporte hasta
Laravel 8 Septiembre 2020 Julio 2022
Laravel 9 Febrero 2022 Febrero 2024
Laravel 10 Febrero 2023 Agosto 2025
Laravel 11 Marzo 2024 Marzo 2026
💡 Dato curioso: Laravel fue creado porque Taylor Otwell no estaba satisfecho con los frameworks PHP existentes como CodeIgniter. El nombre "Laravel" significa "amor" en latín.
← Volver a temas

🔧 Instalación y Configuración

Requisitos del sistema:

  • PHP >= 8.1
  • Composer
  • Extensiones PHP: BCMath, Ctype, cURL, DOM, Fileinfo, JSON, Mbstring, OpenSSL, PCRE, PDO, Tokenizer, XML

Instalación con Composer:

# Crear nuevo proyecto
composer create-project laravel/laravel mi-app

# Especificar versión
composer create-project laravel/laravel:^10.0 mi-app

# Entrar al proyecto
cd mi-app

# Iniciar servidor de desarrollo
php artisan serve

# Acceder a http://localhost:8000

Instalación con Laravel Installer:

# Instalar Laravel Installer globalmente
composer global require laravel/installer

# Crear proyecto
laravel new mi-app

# Con Jetstream (auth completo)
laravel new mi-app --jet

# Con Breeze (auth ligero)
laravel new mi-app --starter-kit=blade

Estructura de directorios:

mi-app/
├── app/           # Lógica de la aplicación
│   ├── Http/      # Controladores, Middleware, Requests
│   ├── Models/    # Modelos Eloquent
│   └── Providers/ # Service providers
├── bootstrap/     # Archivos de arranque
├── config/        # Archivos de configuración
├── database/      # Migraciones, seeders, factories
├── public/        # Punto de entrada (index.php)
├── resources/     # Vistas, assets, lang
├── routes/        # Definición de rutas
├── storage/       # Logs, archivos, cache
└── tests/         # Pruebas automatizadas

Configuración del entorno:

# Copiar archivo de entorno
cp .env.example .env

# Generar clave de aplicación
php artisan key:generate

# Configurar base de datos en .env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=mi_app
DB_USERNAME=root
DB_PASSWORD=secret
💡 Tip: Nunca compartas tu archivo .env. Contiene información sensible como credenciales de base de datos y claves API.
← Volver a temas

📚 Conceptos Básicos

Service Container:

El Service Container es una herramienta poderosa para gestionar dependencias y realizar inyección de dependencias.

// Binding en AppServiceProvider
public function register()
{
    $this->app->bind('Repository', function ($app) {
        return new EloquentRepository();
    });
}

// Inyección automática
public function index(UserRepository $repo)
{
    return $repo->all();
}

Service Providers:

Los providers son el lugar central para configurar tu aplicación.

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        // Registrar bindings
    }

    public function boot()
    {
        // Ejecutar después de que todos los providers estén registrados
    }
}

Facades:

Las facades proporcionan una interfaz estática para las clases disponibles en el service container.

use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;

// Uso de facades
$users = DB::table('users')->get();
Cache::put('key', 'value', 3600);
Mail::to($user)->send(new OrderShipped());

Helpers comunes:

Helper Descripción
app() Obtener instancia del container
auth() Obtener instancia de autenticación
config() Obtener valor de configuración
env() Obtener variable de entorno
request() Obtener instancia de request
response() Crear respuesta HTTP
view() Obtener vista
💡 Tip: Las facades son opcionales. Puedes usar inyección de dependencias para un código más testeable.
← Volver a temas

🛣️ Routing, Controllers, Views

Rutas básicas:

// routes/web.php

// Ruta básica
Route::get('/', function () {
    return view('welcome');
});

// Ruta con parámetro
Route::get('/user/{id}', function ($id) {
    return "User $id";
});

// Ruta con parámetro opcional
Route::get('/user/{name?}', function ($name = 'Guest') {
    return "Hello $name";
});

// Ruta con nombre
Route::get('/profile', function () {
    return view('profile');
})->name('profile');

// Generar URL
$url = route('profile');

Grupos de rutas:

// Con middleware
Route::middleware(['auth'])->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
    Route::get('/settings', [SettingsController::class, 'index']);
});

// Con prefijo
Route::prefix('admin')->group(function () {
    Route::get('/users', [AdminController::class, 'users']);
    Route::get('/posts', [AdminController::class, 'posts']);
});

// Combinado
Route::middleware(['auth'])->prefix('api')->group(function () {
    Route::get('/users', [ApiController::class, 'users']);
});

Controladores:

# Crear controlador
php artisan make:controller UserController

# Con métodos CRUD
php artisan make:controller UserController --resource

# Con autenticación
php artisan make:controller UserController --auth
// app/Http/Controllers/UserController.php
namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function index()
    {
        $users = User::all();
        return view('users.index', compact('users'));
    }

    public function show($id)
    {
        $user = User::findOrFail($id);
        return view('users.show', compact('user'));
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
        ]);

        User::create($validated);
        return redirect()->route('users.index');
    }
}

Vistas Blade:

<!-- resources/views/users/index.blade.php -->
@extends('layouts.app')

@section('content')
<div class="container">
    <h1>Usuarios</h1>

    @foreach($users as $user)
        <div class="user-card">
            <h2>{{ $user->name }}</h2>
            <p>{{ $user->email }}</p>
        </div>
    @endforeach

    {{-- Directivas de control --}}
    @if($users->isEmpty())
        <p>No hay usuarios</p>
    @endif

    @foreach($users as $index => $user)
        @if($loop->first)
            <span>Primero</span>
        @endif
    @endforeach
</div>
@endsection

Componentes Blade:

<!-- Crear componente -->
php artisan make:component Alert

<!-- Uso -->
<x-alert type="success" message="Operación exitosa" />
💡 Tip: Usa rutas con nombre para generar URLs. Si cambias la URL, solo necesitas actualizarla en un lugar.
← Volver a temas

🗄️ Migraciones y Seeders

Crear migraciones:

# Crear migración
php artisan make:migration create_users_table

# Crear con modelo
php artisan make:model Post -m

# Crear migración para modificar tabla
php artisan make:migration add_votes_to_users_table --table=users

Ejecutar migraciones:

# Ejecutar todas las migraciones pendientes
php artisan migrate

# Forzar migración (en producción)
php artisan migrate --force

# Revertir última migración
php artisan migrate:rollback

# Revertir todas las migraciones
php artisan migrate:reset

# Revertir y re-ejecutar
php artisan migrate:refresh

# Resetear y sembrar
php artisan migrate:refresh --seed

Estructura de migración:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    public function up(): void
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->text('content');
            $table->foreignId('user_id')->constrained()->onDelete('cascade');
            $table->boolean('published')->default(false);
            $table->timestamps();
            $table->softDeletes();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('posts');
    }
};

Tipos de columnas comunes:

Método Descripción
$table->id() ID autoincremental (BIGINT)
$table->string('name') VARCHAR equivalente
$table->text('content') TEXT equivalente
$table->integer('age') INTEGER equivalente
$table->boolean('active') BOOLEAN equivalente
$table->decimal('price', 8, 2) DECIMAL con precisión
$table->timestamps() created_at y updated_at

Seeders:

# Crear seeder
php artisan make:seeder UserSeeder

# Ejecutar seeders
php artisan db:seed

# Ejecutar seeder específico
php artisan db:seed --class=UserSeeder

# Seed desde DatabaseSeeder
php artisan migrate:refresh --seed
// database/seeders/UserSeeder.php
use App\Models\User;
use Illuminate\Database\Seeder;

class UserSeeder extends Seeder
{
    public function run(): void
    {
        User::create([
            'name' => 'Admin',
            'email' => 'admin@example.com',
            'password' => bcrypt('password'),
        ]);

        // Usando factories
        User::factory(50)->create();
    }
}
💡 Tip: Usa factories para generar datos de prueba realistas. php artisan make:factory ModelFactory --model=User
← Volver a temas

📝 Formularios y Validación

Validación en controlador:

public function store(Request $request)
{
    $validated = $request->validate([
        'name' => 'required|string|max:255',
        'email' => 'required|email|unique:users',
        'password' => 'required|min:8|confirmed',
        'age' => 'nullable|integer|between:18,100',
        'website' => 'nullable|url',
        'birth_date' => 'required|date|before:today',
    ]);

    User::create($validated);
    return redirect()->route('users.index');
}

Reglas de validación comunes:

Regla Descripción
required Campo obligatorio
string Debe ser string
email Debe ser email válido
unique:table Único en la tabla
min:N Valor mínimo
max:N Valor máximo
confirmed Debe coincidir con campo_confirmation
nullable Puede ser null

Form Request Validation:

# Crear Form Request
php artisan make:request StoreUserRequest
// app/Http/Requests/StoreUserRequest.php
class StoreUserRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true; // O lógica de autorización
    }

    public function rules(): array
    {
        return [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'email', 'unique:users'],
            'password' => ['required', 'min:8', 'confirmed'],
        ];
    }

    public function messages(): array
    {
        return [
            'name.required' => 'El nombre es obligatorio',
            'email.unique' => 'Este email ya está registrado',
        ];
    }
}
// En el controlador
public function store(StoreUserRequest $request)
{
    User::create($request->validated());
    return redirect()->route('users.index');
}

Mostrar errores en Blade:

<form method="POST" action="{{ route('users.store') }}">
    @csrf

    <div>
        <label for="name">Nombre</label>
        <input type="text" name="name" value="{{ old('name') }}">
        @error('name')
            <span class="error">{{ $message }}</span>
        @enderror
    </div>

    <button type="submit">Guardar</button>
</form>
💡 Tip: Usa Form Requests para validaciones complejas. Mantienen tus controladores limpios y son reutilizables.
← Volver a temas

🔐 Autenticación

Laravel Breeze (Auth ligero):

# Instalar Breeze
composer require laravel/breeze --dev

# Instalar con Blade
php artisan breeze:install blade

# Instalar con React
php artisan breeze:install react

# Instalar con Vue
php artisan breeze:install vue

# Compilar assets
npm install && npm run build

Laravel Jetstream (Auth completo):

# Instalar Jetstream
composer require laravel/jetstream

# Con Livewire
php artisan jetstream:install livewire

# Con Inertia
php artisan jetstream:install inertia

# Migrar
php artisan migrate

Autenticación manual:

use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;

// Intentar login
if (Auth::attempt(['email' => $email, 'password' => $password])) {
    // Autenticado
    return redirect()->intended('/dashboard');
}

// Login con remember
if (Auth::attempt(['email' => $email, 'password' => $password], $remember)) {
    return redirect()->intended('/dashboard');
}

// Obtener usuario autenticado
$user = Auth::user();
$id = Auth::id();

// Verificar si está autenticado
if (Auth::check()) {
    // Usuario autenticado
}

// Logout
Auth::logout();
return redirect('/');

Proteger rutas:

// En routes/web.php
Route::middleware(['auth'])->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
});

// O en controlador
public function __construct()
{
    $this->middleware('auth');
}

Reset de contraseña:

use Illuminate\Support\Facades\Password;

// Enviar email de reset
Password::sendResetLink(
    request()->only('email')
);

// Resetear contraseña
Password::reset(
    request()->only('email', 'password', 'password_confirmation', 'token'),
    function ($user, $password) {
        $user->forceFill([
            'password' => bcrypt($password)
        ])->save();
    }
);

Verificación de email:

// En el modelo
class User extends Authenticatable implements MustVerifyEmail
{
    // ...
}

// En routes
Route::middleware(['auth', 'verified'])->group(function () {
    // Rutas que requieren email verificado
});
💡 Tip: Para APIs, usa Laravel Sanctum para autenticación simple o Passport para OAuth2 completo.
← Volver a temas

🛡️ Middleware

¿Qué es Middleware?

El middleware actúa como un puente entre una petición y una respuesta. Puede filtrar, modificar o rechazar peticiones.

Middleware incluido:

Middleware Propósito
auth Verifica autenticación
guest Redirige si está autenticado
verified Verifica email confirmado
throttle Limita peticiones (rate limiting)
admin Verifica rol de administrador

Crear middleware:

# Crear middleware
php artisan make:middleware CheckAge

# Registrar en app/Http/Kernel.php
protected $routeMiddleware = [
    'age' => \App\Http\Middleware\CheckAge::class,
];
// app/Http/Middleware/CheckAge.php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckAge
{
    public function handle(Request $request, Closure $next)
    {
        if ($request->age <= 18) {
            return redirect('home');
        }

        return $next($request);
    }
}

Usar middleware:

// En rutas
Route::get('dashboard', function () {
    return view('dashboard');
})->middleware('auth', 'age');

// En controlador
public function __construct()
{
    $this->middleware('auth')->only(['edit', 'update']);
    $this->middleware('age')->except(['index', 'show']);
}

Middleware global:

// En app/Http/Kernel.php
protected $middleware = [
    \App\Http\Middleware\TrustProxies::class,
    \Illuminate\Http\Middleware\HandleCors::class,
    // ... otros middleware globales
];

Middleware groups:

// En Kernel.php
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        // ...
    ],

    'api' => [
        'throttle:api',
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];
💡 Tip: Los middleware se ejecutan en el orden que están definidos. El orden importa cuando un middleware modifica la petición.
← Volver a temas

🌐 APIs RESTful

Crear API Resource:

# Crear resource
php artisan make:resource UserResource

# Crear collection resource
php artisan make:resource UserCollection
// app/Http/Resources/UserResource.php
namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class UserResource extends JsonResource
{
    public function toArray($request): array
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
            'created_at' => $this->created_at->toIso8601String(),
            'posts_count' => $this->whenCounted('posts'),
        ];
    }
}

API Routes:

// routes/api.php
use App\Http\Controllers\Api\UserController;
use App\Http\Resources\UserResource;
use App\Http\Resources\UserCollection;

Route::apiResource('users', UserController::class);

// O rutas manuales
Route::get('/users', [UserController::class, 'index']);
Route::post('/users', [UserController::class, 'store']);
Route::get('/users/{user}', [UserController::class, 'show']);
Route::put('/users/{user}', [UserController::class, 'update']);
Route::delete('/users/{user}', [UserController::class, 'destroy']);

API Controller:

// app/Http/Controllers/Api/UserController.php
namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Resources\UserResource;
use App\Http\Resources\UserCollection;
use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{
    public function index()
    {
        return new UserCollection(User::paginate(15));
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:8',
        ]);

        $user = User::create($validated);
        return new UserResource($user);
    }

    public function show(User $user)
    {
        return new UserResource($user);
    }

    public function update(Request $request, User $user)
    {
        $validated = $request->validate([
            'name' => 'sometimes|required|string|max:255',
            'email' => 'sometimes|required|email|unique:users,email,' . $user->id,
        ]);

        $user->update($validated);
        return new UserResource($user);
    }

    public function destroy(User $user)
    {
        $user->delete();
        return response()->noContent();
    }
}

Respuestas API:

// Respuesta JSON simple
return response()->json([
    'message' => 'Success',
    'data' => $data
]);

// Con código de estado
return response()->json(['error' => 'Not found'], 404);

// Resource
return new UserResource($user);

// Collection
return UserCollection::collection($users);

// Paginación
return UserResource::collection(User::paginate(10));

API Rate Limiting:

// En routes/api.php
Route::middleware('throttle:60,1')->group(function () {
    Route::get('/users', [UserController::class, 'index']);
});
💡 Tip: Usa API Resources para transformar tus modelos. Mantienen tu lógica de presentación separada de tus modelos.
← Volver a temas

🔑 Laravel Sanctum/Passport

Laravel Sanctum (API simple):

# Instalar Sanctum
composer require laravel/sanctum

# Publicar configuración
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"

# Migrar
php artisan migrate
// En el modelo User
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens;
    // ...
}
// Crear token
$token = $user->createToken('api-token')->plainTextToken;

// Usar token en petición
// Authorization: Bearer {token}

// Revocar token
$user->currentAccessToken()->delete();

// Revocar todos los tokens
$user->tokens()->delete();

Proteger rutas con Sanctum:

// routes/api.php
use Illuminate\Http\Request;

Route::middleware('auth:sanctum')->group(function () {
    Route::get('/user', function (Request $request) {
        return $request->user();
    });
});

Tokens con habilidades:

// Crear token con habilidades
$token = $user->createToken('api-token', ['check-status', 'place-orders']);

// Verificar habilidad
if ($request->user()->tokenCan('check-status')) {
    // El usuario tiene esta habilidad
}

// Revocar por habilidad
$user->tokens()->where('name', 'old-token')->delete();

Laravel Passport (OAuth2 completo):

# Instalar Passport
composer require laravel/passport

# Instalar
php artisan passport:install

# Migrar
php artisan migrate
// En el modelo User
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens;
    // ...
}
// En AuthServiceProvider
use Laravel\Passport\Passport;

public function boot()
{
    Passport::routes();
}

Comparativa:

Característica Sanctum Passport
Complejidad Baja Alta
OAuth2 No
SPA Auth
Mobile Tokens
Scopes Básicos Completos
💡 Tip: Usa Sanctum para la mayoría de aplicaciones. Solo usa Passport si necesitas OAuth2 completo con clientes externos.
← Volver a temas

📬 Colas y Jobs

Configuración de colas:

# Configurar en .env
QUEUE_CONNECTION=database

# Crear tabla de jobs
php artisan queue:table

# Migrar
php artisan migrate

# Ejecutar worker
php artisan queue:work

# Worker con opciones
php artisan queue:work --queue=emails --tries=3 --timeout=120

Crear Job:

# Crear job
php artisan make:job SendEmail
// app/Jobs/SendEmail.php
namespace App\Jobs;

use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Mail;

class SendEmail implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public function __construct(
        public User $user,
        public string $message
    ) {}

    public function handle(): void
    {
        Mail::to($this->user->email)
            ->send(new EmailNotification($this->message));
    }

    public function failed(\Throwable $exception): void
    {
        // Manejar fallo
        \Log::error('Job failed: ' . $exception->getMessage());
    }
}

Dispatch de Jobs:

// Dispatch inmediato
SendEmail::dispatch($user, $message);

// Con delay
SendEmail::dispatch($user, $message)->delay(now()->addMinutes(10));

// En cola específica
SendEmail::dispatch($user, $message)->onQueue('emails');

// Con chain
SendEmail::withChain([
    new LogEmail($user),
    new NotifyUser($user)
])->dispatch($user, $message);

Comandos de colas:

# Ver jobs en cola
php artisan queue:monitor database

# Listar jobs fallidos
php artisan queue:failed

# Reintentar job fallido
php artisan queue:retry {id}

# Reintentar todos
php artisan queue:retry all

# Eliminar job fallido
php artisan queue:forget {id}

# Eliminar todos los fallidos
php artisan queue:flush

Job batching:

use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Bus;

$batch = Bus::batch([
    new ProcessPodcast($podcast1),
    new ProcessPodcast($podcast2),
    new ProcessPodcast($podcast3),
])->then(function (Batch $batch) {
    // Todos los jobs completados
})->catch(function (Batch $batch, \Throwable $e) {
    // Primer job fallido
})->finally(function (Batch $batch) {
    // Batch completado (éxito o fallo)
})->dispatch();
💡 Tip: Para producción, usa Redis en lugar de database driver para mejor rendimiento.
← Volver a temas

📢 Notificaciones

Crear notificación:

# Crear notificación
php artisan make:notification InvoicePaid
// app/Notifications/InvoicePaid.php
namespace App\Notifications;

use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\MailMessage;

class InvoicePaid extends Notification
{
    use Queueable;

    public function __construct(
        public float $amount
    ) {}

    public function via($notifiable): array
    {
        return ['mail', 'database', 'slack'];
    }

    public function toMail($notifiable): MailMessage
    {
        return (new MailMessage)
            ->subject('Factura Pagada')
            ->greeting('Hola!')
            ->line('Tu factura ha sido pagada.')
            ->line('Monto: $' . $this->amount)
            ->action('Ver Factura', url('/invoices'))
            ->line('Gracias por tu compra!');
    }

    public function toArray($notifiable): array
    {
        return [
            'invoice_id' => $this->invoiceId,
            'amount' => $this->amount,
        ];
    }

    public function toSlack($notifiable): array
    {
        return [
            'content' => 'Una factura ha sido pagada',
            'attachments' => [
                [
                    'title' => 'Factura #' . $this->invoiceId,
                    'fields' => [
                        [
                            'title' => 'Monto',
                            'content' => '$' . $this->amount,
                        ],
                    ],
                ],
            ],
        ];
    }
}

Enviar notificaciones:

// A un usuario
$user->notify(new InvoicePaid(100.00));

// A múltiples usuarios
$users->notify(new InvoicePaid(100.00));

// Notificación global
Notification::send($users, new InvoicePaid(100.00));

// Desde el controlador
use Illuminate\Support\Facades\Notification;

Notification::send($users, new InvoicePaid(100.00));

Leer notificaciones:

// Notificaciones no leídas
$unread = $user->unreadNotifications;

// Todas las notificaciones
$all = $user->notifications;

// Marcar como leída
$user->unreadNotifications->markAsRead();

// Contar no leídas
$count = $user->unreadNotifications->count();

Notificaciones en tiempo real:

# Instalar Laravel Echo y Pusher
npm install laravel-echo pusher-js
// resources/js/app.js
import Echo from 'laravel-echo';
import Pusher from 'pusher-js';

window.Pusher = Pusher;

window.Echo = new Echo({
    broadcaster: 'pusher',
    key: import.meta.env.VITE_PUSHER_APP_KEY,
    cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER,
    forceTLS: true
});
// En la notificación
public function via($notifiable): array
{
    return ['database', 'broadcast'];
}
💡 Tip: Las notificaciones pueden ser encoladas automáticamente implementando ShouldQueue para no bloquear la respuesta.
← Volver a temas

📚 Contenido del Curso

Módulo 1: Fundamentos

  • Introducción a Laravel
  • Instalación y configuración
  • Conceptos básicos
  • Routing, Controllers, Views
Ir a temas →

Módulo 2: Intermedio

  • Migraciones y seeders
  • Formularios y validación
  • Autenticación
  • Middleware
Ir a temas →

Módulo 3: Avanzado

  • APIs RESTful
  • Laravel Sanctum/Passport
  • Colas y Jobs
  • Notificaciones
Ir a temas →

📝 Ejemplos Rápidos

Comandos Artisan

# Crear proyecto
composer create-project laravel/laravel mi-app

# Servidor de desarrollo
php artisan serve

# Crear controller
php artisan make:controller UserController

# Crear modelo
php artisan make:model User -m

# Ejecutar migraciones
php artisan migrate

# Listar rutas
php artisan route:list

Rutas

// routes/web.php

use App\Http\Controllers\UserController;

// Ruta básica
Route::get('/', function () {
    return view('welcome');
});

// Ruta con parámetro
Route::get('/user/{id}', function ($id) {
    return "User $id";
});

// Ruta con controller
Route::get('/users', [UserController::class, 'index']);

// Route group con middleware
Route::middleware(['auth'])->group(function () {
    Route::get('/dashboard', [DashboardController::class, 'index']);
});

Eloquent ORM

<?php

use App\Models\User;

// Crear
$user = User::create([
    'name' => 'Juan',
    'email' => 'juan@email.com',
    'password' => bcrypt('password'),
]);

// Leer
$users = User::all();
$user = User::find(1);

// Actualizar
$user->update(['name' => 'Pedro']);

// Eliminar
$user->delete();

Blade Template

<!-- resources/views/users/index.blade.php -->

@extends('layouts.app')

@section('content')
<div class="container">
    <h1>Usuarios</h1>

    @foreach($users as $user)
        <tr>
            <td>{{ $user->name }}</td>
            <td>{{ $user->email }}</td>
        </tr>
    @endforeach
</div>
@endsection

📖 Recursos Adicionales

Herramientas

  • Laravel Installer - CLI oficial
  • Laravel Debugbar - Debugging
  • Laravel IDE Helper - Autocompletado

Comunidades

👨‍💻 Desarrollado por Isaac Esteban Haro Torres

Ingeniero en Sistemas · Full Stack · Automatización · Data

📧 Email: zackharo1@gmail.com

📱 WhatsApp: 098805517

💻 GitHub: github.com/ieharo1

🌐 Portafolio: ieharo1.github.io/portafolio-isaac.haro/