#
Accesors
Los accesors de Laravel son una forma de dar presentación a los datos provenientes de un modelo cuando estos están almacenados de una forma poco comprensible, familiar o poco usable para el usuario.
Se definen en los modelos del proyecto. Pueden haber tantos como atributos o columnas de la tabla referenciada por el modelo.
Debes agregar el use del cast Attribute al modelo en el que vayas a crearlos.
use Illuminate\Database\Eloquent\Casts\Attribute;
La sintaxis es la de una función protegida asociada al atributo. El método make es un buen indicador de si hay algún error en la sintaxis como resultado de la versión de laravel utilizada. Este ejemplo está basado en Laravel 9, en otras versiones no será reconocido. Verifica siempre la versión en la que trabajas para usar la sintaxis adecuada.
La palabra get nos indica que es un accesor. Es el indicador de un getter, de la obtención de un dato de la base de datos y que será modificado para su visualización. La función debe nombrarse como el atributo al que referencia. Debe usar también el formato camel case en sustitución del underlying usado en el atributo.
camel case es una convención tipográfica en la que las palabras se juntan y la inicial de cada una se escribe en mayúscula para diferenciarlas, así nombreCompleto es un ejemplo de camel case.
El formato underlying de Laravel es la separación por guión bajo en las palabras que conforman el nombre de un campo de tabla en la base de datos. el ejemplo de user_id es underlying.
protected function firstName(): Attribute
{
return Attribute::make(
get: fn ($value) => ucfirst($value),
);
}
En este ejemplo se entiende que hay un atributo first_name en la base de datos en la tabla user y cuando el atributo sea utilizado en alguna vista la primera letra de la cadena almacenada se cambiará a mayúscula por el método ucfirst().
El ejemplo en el modelo:
namespace App\Models;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Get the user's first name.
*
* @return \Illuminate\Database\Eloquent\Casts\Attribute
*/
protected function firstName(): Attribute
{
return Attribute::make(
get: fn ($value) => ucfirst($value),
);
}
}