Transforma arrays en instancias de Enum con el método mapInto de Laravel

  • Publicado el 04 marzo, 2025
  • Palabras: 144

¿Alguna vez has tenido problemas para transformar arrays en instancias de Enum en Laravel? El método Collection::mapInto mejorado ahora ofrece soporte de primera clase para enumeraciones PHP 8.1, lo que hace que la asignación de enumeraciones sea elegante y sencilla.

Transforma arrays en instancias de Enum con el método mapInto de Laravel

Cuando PHP 8.1 introdujo las enumeraciones como una característica de primera clase, les dio a los desarrolladores una forma poderosa de definir un conjunto de valores posibles para un tipo. Laravel adoptó esta característica por completo y el método Collection::mapInto ahora proporciona una solución limpia para transformar valores sin procesar en instancias de enumeración adecuadas, especialmente útil cuando se manejan entradas de usuario que necesitan conversión a casos de enumeración de tipo seguro. Veamos cómo funciona:

 

public function store(Request $request)
{
    $request->validate([
        'features' => ['array'],
        'features.*' => [new Enum(Feature::class)],
    ]);
    
    $features = $request
        ->collect('features')
        ->mapInto(Feature::class);
    
    if ($features->contains(Feature::DarkMode)) {
        // Enable dark mode functionality
    }
}

 

#Ejemplo práctico

A continuación se muestra un ejemplo más completo que muestra cómo se puede utilizar esta función en un sistema de preferencias de usuario:

 

<?php

namespace App\Enums;

enum Feature: string
{
    case DarkMode = 'dark_mode';
    case BetaFeatures = 'beta_features';
    case AdvancedAnalytics = 'advanced_analytics';
    case CustomThemes = 'custom_themes';
    
    public function isEnterprise(): bool
    {
        return in_array($this, [
            self::AdvancedAnalytics,
            self::CustomThemes
        ]);
    }
}

class UserPreferencesController extends Controller
{
    public function update(Request $request)
    {
        $request->validate([
            'features' => ['array'],
            'features.*' => [new Enum(Feature::class)],
        ]);
        
        // Transform string values into Feature enum instances
        $features = $request
            ->collect('features')
            ->mapInto(Feature::class);
        
        // Check for enterprise features
        $hasEnterpriseFeatures = $features
            ->filter(fn (Feature $feature) => $feature->isEnterprise())
            ->isNotEmpty();
            
        if ($hasEnterpriseFeatures && !$request->user()->hasEnterpriseAccess()) {
            return back()->withErrors([
                'features' => 'Some selected features require an enterprise subscription'
            ]);
        }
        
        // Store the selected features
        $request->user()->preferences()->update([
            'features' => $features->all()
        ]);
        
        return redirect()->route('user.preferences.show')
            ->with('status', 'Preferences updated successfully');
    }
}

 

Tras bambalinas, el método mapInto crea cada instancia de enumeración al pasar el valor original a la clase de enumeración. En el caso de las enumeraciones respaldadas por cadenas, este proceso convierte valores de cadena como 'dark_mode' en el caso de enumeración correspondiente Feature::DarkMode.

Antonio Jenaro
Antonio Jenaro

Web Developer

Archivado en:

Inicia la conversación

Hazte miembro de Antonio Jenaro para comenzar a comentar.

Regístrate ahora

¿Ya estás registrado? Inicia sesión