Hace 8 meses desarrolle un sistema en Laravel y me di cuenta de una problema que teníamos para estar optimizando y corrigiendo errores en 4 métodos que utilizábamos en diferentes clases, teníamos que estar cambiando uno por uno, eso nos quitaba demasiado tiempo y aumentaba la tasa de errores.

Tomando la referencia anterior, imagina que tienes más métodos, definitivamente sería el inicio de un código espagueti, difícil de mantener.

Es por eso que aquí entran en acción los Traits o rasgos, que si eres del miembro del ecosistema Laravel seguramente los has escuchado mucho, sin embargo, no es una característica de este framework.

Entonces…

¿Qué es un trait?

Los traits en PHP son una especie de clases abstractas que ayudan a reutilizar código y a separar funcionalidades del resto de clases. Esta característica fue añadida a partir de la versión 5.4 de PHP.

La ventaja que ofrece un trait es que puedes reutilizar código sin la necesidad de instanciar una clase, solo agregas una línea de código en tu clase y ya tienes todo el poder de tu trait.

¿Cómo se define un trait en Laravel?

La mejor forma de definir un trait en Laravel es crear una carpeta llamada Traits y Rasgos en la carpeta app, con el fin de tener todo modularizado y si es necesario moverla en algún futuro sea mucho más fácil.

Teniendo esta convención crearías un namespace llamado App\Traits y así mandamos llamar al trait en cada clase que lo requiera.

A continuación te enseñaré la estructura de un trait en Laravel:

<?php
namespace App\Traits;

trait ExampleTrait {
    public function example_method()
    {
        return true;
    }
}

¿Cómo funciona un trait?

Una vez que ya lo definimos debemos utilizarlo, para eso elegiremos nuestra clase para importar nuestro trait de la siguiente manera:

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use App\Traits\ExampleTrait;

class User extends Authenticatable
{
    use ExampleTrait;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

}

Anteriormente importamos la clase con use App\Traits\ExampleTrait; haciendo esto tendremos nuestro trait disponible para comenzar a utilizar sus métodos.

¿Cómo ejecuto un trait?

Una vez que ya lo importaste a tu clase, tendrás que mandarlo llamar para ejecutar el método que requieras, por ejemplo:

User::example_method()

En este caso estamos utilizando el método example_method() que definimos en nuestro trait.

O bien si lo requieres utilizar en la misma clase puedes hacerlo de la siguiente manera:

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use App\Traits\ExampleTrait;

class User extends Authenticatable
{
    use ExampleTrait;
    
    public function example_user_method()
    {
        return $this->example_method();
    }
}

Cuando importas un trait a tu clase tendrás disponible todos los métodos en la variable $this.

Conclusiones

Si tienes ciertos métodos que necesitas en diferentes clases deberías tener que reutilizar código, eso se traduciría en ahorro de tiempo para realizar labores de mantenimiento y optimización de código.

También, si tu proyecto está montado en Laravel  los traits jugarán un papel importante si tu objetivo es personalizar funcionalidades del framework ya que por defecto, los traits reemplazan los métodos de las clases heredadas.

Obtén beneficios exclusivos

Suscríbete al boletín y obtén beneficios exclusivos directo en tu correo.

Gracias por suscribirte...

Algo salió mal...