CARACTERÍSTICAS OCULTAS DE LARAVEL

  • Route Binding: En vez de hacer esto todo el tiempo:

    Route::get('/posts/{id}', function ($id) {
    $post = Post::findOrFail($id);
    // ...
    });
    
    Laravel puede inyectar el modelo automáticamente:

    Route::get('/posts/{post:slug}', [PostController::class, 'show']);
    // Laravel busca automáticamente por el campo 'slug'
    
    Se pueden crear bindings personalizados en "AppServiceProvider":

    Route::bind('post', fn ($value) => Post::where('slug', $value)->firstOrFail
    
  • Lazy Collections: Cuando trabajas con miles o millones de registros, get() te mata la memoria.

    // Antes (boom de memoria)
    $users = User::where('active', true)->get();
    
    // Ahora (usa generadores de PHP)
    User::where('active', true)->lazy()->each(function ($user) {
    // procesa uno por uno sin cargar todo
    $user->sendWelcomeEmail();
    });
    
    Es ideal para exports masivos, migraciones y procesamiento de datos grandes.
  • El Helper tap(): Es el helper más infravalorado de Laravel. Ejemplo

    // Sin tap()
    $user = new User();
    $user->name = 'Juan';
    $user->save();
    return $user;
    
    // Con tap() (más limpio y fluido)
    $user = tap(new User, function ($user) {
    $user->name = 'Juan';
    $user->save();
    });
    
    También funciona con colecciones y objetos existentes:

    $user = tap($user, fn ($u) => $u->update(['verified' => true]));
    
  • Consultas Condicionales: Alternativa a los "if". Limpio, legible y perfecto para filtros dinámicos. Ejemplo

    $query = User::query();
    
    $query->when($request->filled('role'), fn ($q) => 
    $q->where('role', $request->role)
    );
    
    $query->when($request->has('active'), fn ($q) => 
    $q->where('active', true)
    );
    
    $users = $query->get();
    
  • Attribute Casting: Evita la conversión manual de booleanos, fechas o JSON. En cualquier modelo:

    protected $casts = [
    'is_active' => 'boolean',
    'price'=> 'decimal:2',
    'meta' => 'array',
    'published_at'  => 'datetime',
    'options'  => 'encrypted', // ¡Laravel 10+!
    ];
    
    Ahora se puede hacer:

    
    if ($user->is_active) { ... } // ya es boolean real
    $user->meta['theme'] = 'dark'; // array mutable
    
  • Blade "@once": Evita de que se dupliquen scripts o estilos cuando se usan componentes en bucles. Es perfecto para analytics, modales, WebSockets o estilos críticos:

    @once
    
    @endonce
    
  • Mensajes de Orden Superior en Colecciones

    // En vez de esto
    $users->each(function ($user) {
    $user->sendEmail();
    });
    
    // Haz esto (¡una sola línea!)
    $users->each->sendEmail();
    
    //También funciona con:
    $users->map->fullName();
    $users->filter->isActive();
    $users->each->update(['last_login' => now()]);