Laravel nos permite crear métodos para transformar o dar un formato automáticamente a los datos que leemos y guardamos en la base de datos. Estos son los Accessors, los cuales nos facilitarán el trabajo de mostrar los datos de manera más legible en el formato que deseemos y los Mutators que nos brindan la certeza de que los datos se están almacenando con el formato correcto en la base de datos. En este tutorial te enseñaremos cómo podemos crearlos.
Los Accessors son métodos que definimos en el modelo para modificar el valor de un campo antes de ser devuelto y usado en una vista, controlador, etc. Por su parte, los Mutators son métodos que modifican el valor de un campo antes de ser almacenado en una base de datos.
Estos métodos se llaman automáticamente, en caso de que estén presentes, cuando se intenta acceder o establecer un campo como un atributo de un modelo, por ejemplo: $user->first_name
.
Para definir un Accessor se crea un método en el modelo con la siguiente convención de nombre: getFooAttribute()
, donde:
- Se comienza con la palabra
get
. - Luego, el nombre del atributo al que se quiere acceder reemplazando su nomenclatura snake_case con la nomenclatura StudlyCase.
- Y, finalmente, la palabra
Attribute
.
Para crear un Mutator se sigue la misma convención, pero se cambia el prefijo get
por set
, quedando el nombre así: setFooAttribute()
.
Creando Accessors y Mutators
Vamos a hacer uso del archivo de migración por defecto de Laravel para el modelo User
, pero con los siguientes atributos:
// public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('first_name'); $table->string('last_name'); $table->string('email')->unique(); $table->string('password'); $table->timestamps(); }); }
Recuerda configurar las credenciales tu base de datos en el archivo .env
de tu proyecto Laravel.
Y ejecutamos las migraciones con:
# php artisan migrate
Uno de los mutators más comunes es cifrar la contraseña del usuario, para eso creamos en el modelo app/Models/User.php
el método setPasswordAttribute()
y de esta manera cuando se establezca una nueva contraseña será cifrada:
// public function setPasswordAttribute($value) { $this->attributes['password'] = bcrypt($value); }
Además, crearemos otros dos métodos para que el nombre y apellido del usuario se conviertan a minúsculas y su primer carácter en mayúscula:
// public function setFirstNameAttribute($value) { $this->attributes['first_name'] = ucfirst(strtolower($value)); }
// public function setLastNameAttribute($value) { $this->attributes['last_name'] = ucfirst(strtolower($value)); }
Nota cómo se asocia el campo last_name con su mutator setLastNameAttribute.
Recuerda reemplazar el atributo name
dentro de la propiedad $fillable
por los atributos first_name
y last_name
.
Ahora, podemos probar creando un nuevo usuario mediante una ruta. Para ello, agregamos lo siguiente al archivo routes/web.php
:
// Route::get('/', function () { return User::create([ 'first_name' => 'MARIA', 'last_name' => 'perez', 'email' => '[email protected]', 'password' => 'secret', ]); });
Recuerda importar la clase App\Models\User
.
Si ejecutamos en la consola: php artisan serve
y vamos a la URL http://127.0.0.1:8000/, obtenemos como resultado:
{ "first_name": "Maria", "last_name": "Perez", "email": "[email protected]", "updated_at": "2020-11-20T10:15:53.000000Z", "created_at": "2020-11-20T10:15:53.000000Z", "id": 1 }
Donde la contraseña fue encriptada:
Si deseas aprender cómo conectarte a MySQL/MariaDB y consultar los datos tus tablas desde la terminal, revisa nuestro curso Introducción a SQL y las Bases de Datos.
De igual forma, los Accessors nos permiten darle formato a los atributos de un modelo, por ejemplo, para mostrar el nombre en mayúsculas podemos agregar el siguiente método en app/Models/User.php
:
// public function getFirstNameAttribute($value) { return strtoupper($value); }
y ahora modificamos nuevamente la ruta para mostrar el atributo first_name
del usuario creado:
// Route::get('/', function () { $user = User::find(1); return $user->first_name; });
Obtenemos como resultado: MARIA.
Otro uso que le podemos dar a los Accessors, además de darle formato a un atributo, es unir el valor de varios atributos en uno solo y así crear un formato que nos sea de utilidad:
// public function getFullNameAttribute() { return $this->first_name . ' ' . $this->last_name; }
y de esta manera, aunque no tengamos el campo full_name
en la base de datos, Laravel lo reconoce cuando hacemos el llamado:
// Route::get('/', function () { $user = User::find(1); return $user->full_name; });
Mostrando como resultado: Maria Perez
Material relacionado
- Uso de métodos y propiedades mágicas con PHP
- Curso de programación orientada a objetos con PHP
- Curso de Eloquent ORM
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.