Usar enums en Laravel

Un overview a los enum, que se incorporaron en PHP8.1, y cómo aprovecharlos en Laravel.

Usar enums en Laravel
Photo by Muha Ajjan / Unsplash

Desde PHP 8.1 podemos usar enums en PHP. Es bastante sencillo:

<?php

namespace App\Enums;

enum UserType {
	case Admin;
    case User;
}

Incluso podemos definir el tipo de dato, aunque de momento sólo funciona para int y string:

<?php

namespace App\Enums;

enum UserType: string {
	case Admin = 'admin';
    case User = 'user';
}

Ahora, con Laravel, podemos usarlos en distintos lugares. Por ejemplo, en migraciones:

public function up()
{
	Schema::create('users', function (Blueprint $table) {
		$table->id();
		$table->string('email', 100)->unique();
		$table->enum('role', ['admin', 'user'])->default(UserType::User->value);
		$table->timestamps();
	});
}

Luego podemos usarlo con Eloquent de las siguientes formas:

User::create([
    'email' => 'hi@raullg.com',
    'role' => UserType::Admin,
]);
User::where('role', UserType::Admin)->get();

O incluso, podemos configurar Eloquent para castear los valores a tipo Enum:

use App\Enums\UserType;

class User extends Model {
	// ...
	protected $casts = [
		'role' => UserType::class,
	];
}


// ...

$user = User::first();
$user->role; // devuelve un tipo enum

Además, una cosa guay de esto es que en PHP 8.1 los enum son como clases de PHP, por lo que también pueden tener métodos:

enum UserType: string {
	case Admin = 'admin';
	case User = 'user';
    
    public function isAdmin(): bool
	{
		return $this->value === self::Admin->value;
	}

	public function isUser(): bool
	{
		return $this->value === self::User->value;
	}
}

// ...

if ($user->role->isAdmin()) {
	// do something
}

Como vemos, los enums de PHP8.1 son muy poderosos y pueden mejorar bastante la estructura de nuestro código. Larga vida a los enum :-)