Propiedades computadas en Laravel Livewire

Video thumbnail

Una funcionalidad interesante en Livewire es el uso de las propiedades computadas. Estas no son más que funciones definidas en el componente con la estructura get<NombrePropiedad>Property, y se consumen simplemente accediendo a <nombrePropiedad>. La principal particularidad de estas propiedades es que son útiles para derivar valores desde la base de datos u otro almacenamiento persistente, como un caché.

app/Http/Livewire/Dashboard/Category/Index.php

public function getCategoryProperty()
   {
       if ($this->categoryToDelete)
           return Category::find($this->categoryToDelete->id);
       return "Sin categoría seleccionada";
   }

Para consumir esta propiedad desde la clase o la vista, siempre debes utilizar $this:

$this->category

Puedes mostrar el valor en la vista de la siguiente manera:

resources/views/livewire/dashboard/category/index.blade.php

"Sin categoría seleccionada"

También puedes declarar una propiedad computada usando el atributo #[Computed], como se muestra a continuación:

// function getCategoryProperty()
#[Computed()]
function category() {
 ***    
}

Vamos a implementar una propiedad computada que devuelva la hora actual y compararla con un método tradicional para entender mejor su comportamiento:

#[Computed()]
function getTimeP()
{
   sleep(1);
   return time();       
}
function getTime()
{
   sleep(1);
   return time();    
}
Y en la vista:
{{ $this->getTimeP }}
{{ $this->getTimeP }}
{{ $this->getTimeP }}
{{ $this->getTimeP }}
{{ $this->getTimeP }}
<br>
{{$this->getTime()}}
{{$this->getTime()}}

Cuando se utilizan propiedades computadas, el valor se cachea automáticamente. Por lo tanto, verás que, sin importar cuántas veces se invoque, getTimeP devolverá el mismo valor, por ejemplo:

1728727286 1728727286 1728727286 1728727286 1728727286

En cambio, el método tradicional getTime() se ejecutará cada vez, así que obtendrás:

1728727287 1728727288

Esto demuestra que las propiedades computadas almacenan en caché el resultado hasta que cambia alguna de las propiedades internas que afectan su resultado, o se actualiza explícitamente.

Ventajas de las Propiedades Computadas

Método con lógica personalizada: Puedes construir una propiedad que internamente haga operaciones complejas, como consultas a la base de datos o cálculos derivados.

Cacheo automático: Una vez calculado el valor, este se guarda internamente. No se vuelve a ejecutar el método salvo que se detecte un cambio en sus dependencias o se actualice explícitamente.

Esto es ideal para operaciones costosas o cuando quieres evitar llamadas repetidas a servicios externos o a la base de datos.

class ShowUser extends Component
{
    public $userId;
 
    #[Computed]
    public function user()
    {
        $key = 'user'.$this->getId();
        $seconds = 3600; // 1 hour...
 
        return Cache::remember($key, $seconds, function () {
            return User::find($this->userId);
        });
    }
 
    // ...
}
class ShowUser extends Component
{
    public $userId;
 
    #[Computed]
    public function user()
    {
        return User::find($this->userId);
    }
}

<h1>{{ $this->user->name }}</h1>

Acepto recibir anuncios de interes sobre este Blog.

Vamos a presentar las propiedades computadas en Laravel Livewire.

- Andrés Cruz

In english