Laravel: Mutadores y Accesores (parte 12)

Laravel: Mutadores y Accesores (parte 12)

Archivos:

  • Models/Curso.php

Definiciones

Los mutadores y accesores nos dan cierto control sobre la forma en que almacenamos o leemos los registros en la base de datos.

El código para crear un mutador y un accesor

Al principio del modelo tenemos que importat la definición del atributo al que luego vamos a llamar:

use Illuminate\Database\Eloquent\Casts\Attribute;

Luego, dentro de la clase user, incluiremos un método (al final de la clase) con el siguiente código:

(...)
protected function name(): Attribute { // 1

    protected function name(): Attribute { // 1

        return new Attribute( 

            get: function($value) { // 4
                return ucwords($value); // 6
            }, // 5

            set: function($value) { // 2
                return strtolower($value); // 3
            }
        );
    } 
(...)

Explicación del código

  1. Debemos crear una función de tipo protected con el mismo nombre del atributo que queremos modificar, que nos retorne una nueva instancia de la clase Attribute (por eso los dos puntos y la palabra Attribute)
  2. Dentro de la función capturaremos lo que esté mandando dentro del atributo name, en una variable llamada value, con una función precedida por la palabra set.
  3. El campo se transformará en minúsculas, por lo que usamos una función de php llamada strlower. Cada vez que intentemos agregar un nuevo registro, antes de almacenarlo, lo transformará en minúsculas y lo almacenará en la base de datos
  4. El accesor lo escribimos antes que el mutador, con la palabra get y estableciendo también una función con el parámetro $value
  5. El mutador y el accesor van separados por una coma
  6. Usamos el me´todo de php que transformará el valor con cada palabra en mayúsculas, el método ucwords.

Funcionando desde Tinker

Así podemos probar que nuestro mutador funciona como es debido.

php artisan tinker // abrir tinker
use App\Models\User; // usar el modelo
$user = new User(); // creamos una instancia del modelo
$user-> name='Jorge GOMeZ' // le asignamos el atributo name
// nótese que hay mayúsculas y minúsculas indiscriminadamente
$user-> email='Jorge@email.com' // le asignamos un mail
$user-> password=bcrypt(12345678) // le asignamos una contraseña, encriptada
$user-> save()// almacenamos los valores, que se almacenarán "mutados"

Para probar el accesor, también desde Tinker:

php artisan tinker // abrir tinker
use App\Models\User; // usar el modelo
$user = new User::first(); // leemos el primer registro de nuestra base de datos

Usando las funciones flecha de PHP 8

Esta forma de escribir las funciones nos las provee la versión 8 de PHP y sucesivas, para un código más breve:

protected function name(): Attribute { 

        return new Attribute( 

            get: fn($value) => ucwords($value),
            set: fn($value) => strtolower($value)
        );
}  

Los mutadores y accesores en versiones anteriores

public function getNameAttribute($value) {
     return ucwords($value);
}

public function getNameAttribute($value) {

     $this->attributes['name']=strtolower($value);
}

Recursos:

Enlace de Youtube: https://www.youtube.com/watch?v=0st6AA_7fBA&list=PLZ2ovOgdI-kWWS9aq8mfUDkJRfYib-SvF&index=16