Parar el lifecycle de Filament a través de `halt`

Introducción al uso de la función `halt()` para parar la ejecución de un lifecycle de Filament.

Parar el lifecycle de Filament a través de `halt`
Photo by Will Porada / Unsplash

En este post quería introducir un concepto de Filament que no conocía y que me contó mi compañero Ismael.

Durante la ejecución del lifecycle de las acciones de Filament (`beforeValidate`, afterValidate, beforeCreate, afterCreate, beforeSave, afterSave, etc.) es posible llamar a una función que para por completo el lifecycle. Esto es especialmente útil para casos en los que quieres permitir al usuario rellenar el formulario y ejecutar una validación extra antes de, por ejemplo, guardarlo.

Imagina el caso de un acceso a Filament por suscripción. Ciertas características son posibles, pero solamente es posible añadir hasta X recursos. Al intentar guardar el item X + 1, debería mostrarse una alerta al usuario de que no es posible:

use Filament\Notifications\Actions\Action;
use Filament\Notifications\Notification;
 
protected function beforeCreate(): void
{
    if (! $this->record->team->subscribed()) {
        Notification::make()
            ->warning()
            ->title('You don\'t have an active subscription!')
            ->body('Choose a plan to continue.')
            ->persistent()
            ->actions([
                Action::make('subscribe')
                    ->button()
                    ->url(route('subscribe'), shouldOpenInNewTab: true),
            ])
            ->send();
 
        $this->halt();
    }
}

Aquí, al llamar a $this->halt();, se para por completo el lifecycle de Filament y no se termina de crear el registro, haciéndolo perfecto para añadir este tipo de validaciones.