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.

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.
Inicia la conversación
Hazte miembro de Antonio Jenaro para comenzar a comentar.
Regístrate ahora¿Ya estás registrado? Inicia sesión