Optimizando el desarrollo en Laravel con Filament: Gestión de recursos

Filament
Solucionex
14
Feb 25

Filament es un framework de desarrollo ágil para Laravel que facilita la creación de paneles de administración modernos de forma rápida y sencilla, proporcionando una experiencia intiutiva y fluida para el usuario.

 

Requisitos

Para poder utilizar Filament, debemos contar con los siguientes requisitos:

  • PHP 8.1 o superior
  • Laravel 10 o superior
  • Livewire 3 o superior

 

Instalación de Filament

Para instalar Filament, ejecutaremos los siguientes comandos dentro de nuestro proyecto:

composer require filament/filament:"^3.2" -W
php artisan filament:install --panels

Esto creará y registrará un nuevo service provider en /app/Providers/Filament/AdminPanelProvider.php

Para más detalles sobre instalación de componentes y más, consultar la documentación oficial de Filament.

 

Crear y gestionar recursos

Para comenzar a trabajar con Filament, primero debemos crear un usuario para el panel de administración con:

php artisan make:filament-user

Una vez generado, podremos acceder a /admin, iniciar sesión y visualizar el dashboard del panel.

 

Generando recursos

Una vez hayamos configurado nuestros modelos y ejecutado nuestras migraciones, podremos empezar a generar los recursos para cada uno de ellos.

Para poder generar un nuevo recurso en Filament bastaría con lanzar el siguiente comando:

Suponiendo que tenemos un modelo Cliente

php artisan make:filament-resource Cliente

Esto nos generará varios archivos dentro del directorio /app/Filament/Resources.

+-- ClienteResource.php
+-- ClienteResource
|    +-- Pages
|    |   +-- CreateCliente.php
|    |   +-- EditCliente.php
|    |   +-- ListClientes.php

Si visitamos la ruta /admin/clientes en nuestro navegador, podremos ver el listado de clientes, por ahora vacío, y una opción en el menu lateral "Clientes".

Crear nuevos registros

Para crear un nuevo registro, abrimos el Resource generado por Filament, en este caso ClienteResource.php, y dentro de él, modificamos el método form(), qye tiene un array schema vacío. Aquí generaremos los campos que queremos que aparezcan en nuestros formularios. Puedes consultar los campos disponibles y cómo añadirlos al recurso desde el siguiente enlace.

Supongamos que nuestro Cliente tiene un campo nickname, el cual no debe ser mayor de 10 caracteres ni puede ser nulo, y un campo tipob. Para agregar estos campos a nuestro formulario, el código sería el siguiente:

use Filament\Forms;
use Filament\Forms\Form;

public static function form(Form $form): Form
{
	return $form
		->schema([
			Forms\Components\TextInput::make('nickname')
				->required()
				->maxLength(10),
			Forms\Components\Select::make('tipo')
				->options([
					'recurrente' => 'Recurrente',
					'normal' => 'Normal',
 				])
 				->required(),
		]);
}

Con esto, nuestros formularios estarán listos para mostrar y validar estos campos.

Hay muchas más configuraciónes para la creación de recursos, como los Lifecycle Hooks, las notificaciones, etc. Puedes consultarlo desde el siguiente enlace.

Para modificar estos registros, solo necesitamos editarlos desde el listado del recurso. Si deseamos modificar los datos antes de que se muestrén en el formulario de edición, podemos crear un método mutateFormDataBeforeFill(), donde prodremos realizar los cambios necesarios a esos datos.

 

Vista de los registros

Para poder ver los registros creados para un recurso, necesitaremos crear una nueva vista para ello usando la flag --view:

php artisan make:filament-resource Cliente --view

Por defecto, la página de vista que generamos muestra un formulario deshabilitado con los datos del registro. Si deseamos mostrar los datos como una vista normal, tendremos que definir un método infoList() en la clase de nuestro Resource:

use Filament\InfoLists;
use Filament\InfoLists\InfoList;

public static function form(Form $form): Form
{
	    return $infolist
        ->schema([
            Infolists\Components\TextEntry::make('nickname'),
        ]);
}

 

Eliminar registros

Por defecto, todos los registros que eliminemos serán borrados de la base de datos. Para evitar esto debemos añadir la flag --soft-deletes al generar el Resource:

php artisan make:filament-resource Cliente --soft-deletes

Si el recurso ya está creado, también podremos añadir esta funcionalidad. Para ello, tenemos que actualizar el Resource:

use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;

public static function table(Table $table): Table
{
    return $table
            ->columns([
                        // ...
             ])
             ->filters([
                 Tables\Filters\TrashedFilter::make(),
                 // ...        
             ])
             ->actions([
             	Tables\Actions\DeleteAction::make(), // Con esta acción añadimos el poder borrar un registro en la tabla
             	Tables\Actions\ForceDeleteAction::make(),
             	Tables\Actions\RestoreAction::make(),
             	// ...
             ])
             ->bulkActions([
             	Tables\Actions\BulkActionGroup::make([
             		Tables\Actions\DeleteBulkAction::make(), // Con esta acción añadimos el poder borrar muchos registros de la tabla
             		Tables\Actions\ForceDeleteBulkAction::make(),
             		Tables\Actions\RestoreBulkAction::make(),
             		// ...
             	]),
             ]);
}

public static function getEloquentQuery(): Builder
{    
	return parent::getEloquentQuery()
	        ->withoutGlobalScopes([
	                   SoftDeletingScope::class,
	         ]);
}

 

Conclusión

Filament es una herramienta poderosa que facilita la creación de paneles de administración modernos y altamente personalizables en Laravel. 

En este post hemos cubierto los conceptos básicos para comenzar, desde la instalación hasta la creación de registros y personalización de formularios.

 

En próximos artículos, profundizaremos en cómo estructurar el dashboard y las vistas de los Resource.

 

 

Fuente: Documentación oficial de Filament

laravel