Usar enums en Laravel
Un overview a los enum, que se incorporaron en PHP8.1, y cómo aprovecharlos en Laravel.
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 :-)