Keepers
Los Keepers son clases que centralizan la lógica de procesamiento y cálculo de campos de un modelo Eloquent. Mientras que las Actions encapsulan operaciones de negocio completas que pueden afectar a múltiples modelos, los Keepers se enfocan en gestionar los valores de campos individuales dentro del contexto de un modelo específico.
El problema que resuelven
Es habitual que la lógica para calcular campos derivados (texto de búsqueda, contadores, slugs) acabe dispersa en observers o inflando el modelo con métodos. Los Keepers extraen esta responsabilidad a clases dedicadas.
Larakeep
El paquete Larakeep, creado por la comunidad española, implementa este patrón. Se instala con composer require edulazaro/larakeep y permite generar Keepers con Artisan:
php artisan make:keeper PostKeeper
Un Keeper define métodos que siguen la convención get + nombre del campo en CamelCase:
namespace App\Keepers;
class PostKeeper
{
public function getSearchText()
{
return $this->post->title . ' ' . $this->post->body;
}
public function getWordCount()
{
return str_word_count($this->post->body);
}
}
Configuración en el modelo
Se registra el Keeper en el modelo usando el trait HasKeepers y el atributo KeptBy:
use EduLazaro\Larakeep\Concerns\HasKeepers;
use EduLazaro\Larakeep\Attributes\KeptBy;
#[KeptBy(PostKeeper::class)]
class Post extends Model
{
use HasKeepers;
}
Uso
Una vez configurado, se procesan los campos llamando a process() sobre la instancia del modelo:
// Procesar un campo
$post->process('search_text');
// Procesar varios campos a la vez
$post->process(['search_text', 'word_count']);
// Con parámetros
$post->processWith('search_text', $param);
// Los valores no se guardan automáticamente
$post->process('search_text')->save();
También soporta tareas personalizadas con prefijos distintos a get:
// En el Keeper
public function configureSearchText()
{
// Lógica de configuración
}
// Invocar con el nombre de la tarea
$post->processTask('configure', 'search_text');
Keepers vs Actions
Las Actions son operaciones de negocio autocontenidas que pueden afectar a múltiples modelos (crear factura, enviar notificación). Los Keepers se centran en computar y mantener valores de campos dentro del contexto de un solo modelo (generar texto de búsqueda, calcular rankings). Ambos patrones son complementarios.