What's the fastest way to implement Gravatar URLs in Laravel? I have a mandatory email address field, but I don't want to create a new column for Gravatars, and I'd prefer to use the native Auth::user()
attributes.
Asked
Active
Viewed 7,501 times
2 Answers
66
Turns out, you can use a Laravel mutator to create attributes that don't exist in your model. Assuming you have a User
model with a mandatory email
column in the corresponding users
table, just stick this in your User
model:
public function getGravatarAttribute()
{
$hash = md5(strtolower(trim($this->attributes['email'])));
return "http://www.gravatar.com/avatar/$hash";
}
Now when you do this:
Auth::user()->gravatar
You'll get the gravatar.com URL you're expecting. Without creating a gravatar column, variable, method, or anything else.

Wogan
- 1,335
- 12
- 17
12
Expanding on Wogan's answer a bit...
Another example using a Trait:
namespace App\Traits;
trait HasGravatar {
/**
* The attribute name containing the email address.
*
* @var string
*/
public $gravatarEmail = 'email';
/**
* Get the model's gravatar
*
* @return string
*/
public function getGravatarAttribute()
{
$hash = md5(strtolower(trim($this->attributes[$this->gravatarEmail])));
return "https://www.gravatar.com/avatar/$hash";
}
}
Now on a given model (i.e. User) where you want to support Gravatar, simply import the trait and use it:
use App\Traits\HasGravatar;
class User extends Model
{
use HasGravatar;
}
If the model doesn't have an email
column/attribute, simply override the default by setting it in the constructor of your model like so:
public function __construct() {
// override the HasGravatar Trait's gravatarEmail property
$this->gravatarEmail = 'email_address';
}

anderly
- 727
- 7
- 16
-
1Excellent! Yeah I'd definitely recommend a Trait-based approach now, after working with Laravel for two years. Thanks for sharing @anderly! – Wogan Aug 27 '16 at 17:43
-
Really grateful for the excellent answers. Respect for you both! – Imtiaz Jan 09 '23 at 08:46