Campos requeridos condicionalmente según contexto en Filament

Cómo usar el contexto en Filament para requerir campos de forma condicional.

Campos requeridos condicionalmente según contexto en Filament
Photo by Yura Fresh / Unsplash

Uno de los casos con los que más nos encontramos en Calima con Filament es la gestión de usuarios. Normalmente queremos que, al crear un usuario, su contraseña sea obligatoria. Sin embargo, una vez creado, para editarlo no necesita rellenarla desde el panel.

Contraseña obligatoria al crear un usuario
Contraseña opcional al editar un usuario ya existente

Para hacer esto en Filament, podemos especificar un contexto en el cual el campo es requerido o no:

<?php

namespace App\Filament\Resources;

use App\Models\User;
use Filament\Forms;
use Filament\Resources\Form;
use Filament\Resources\Resource;
use Illuminate\Support\Facades\Hash;

class UserResource extends Resource
{
    protected static ?string $model = User::class;

    protected static ?string $navigationIcon = 'heroicon-o-user';

    public static function form(Form $form): Form
    {
        return $form
            ->schema([
	            // ...
                Forms\Components\TextInput::make('password')
                    ->required(fn (string $context) => $context === 'create')
                    ->dehydrateStateUsing(fn ($state) => Hash::make($state))
                    ->dehydrated(fn ($state) => filled($state))
                    ->password(),
                // ...
            ]);
    }
    
    // ...
}