2014-05-18 7 views
14

Qual è il modo più veloce per implementare gli URL Gravatar in Laravel? Ho un campo di posta elettronica obbligatorio, ma non voglio creare una nuova colonna per Gravatars, e preferirei usare gli attributi nativi Auth::user().Come implementare Gravatar in Laravel?

risposta

32

Risulta, è possibile utilizzare un mutatore Laravel per creare attributi che non esistono nel modello. Supponendo di avere un modello User con una colonna di email obbligatorio nella corrispondente users tavolo, basta attaccare questo nel modello User:

public function getGravatarAttribute() 
{ 
    $hash = md5(strtolower(trim($this->attributes['email']))); 
    return "http://www.gravatar.com/avatar/$hash"; 
} 

Ora, quando si esegue questa operazione:

Auth::user()->gravatar 

otterrai i gravatar.com URL che ti aspetti. Senza creare una colonna gravatar, una variabile, un metodo o qualsiasi altra cosa.

+0

wow, questo è ottimo – jhamPac

4

Ampliando la risposta di Wogan un po '...

Un altro esempio utilizzando un 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"; 
    } 

} 

Ora su un dato modello (ad esempio Utente) in cui si desidera supportare Gravatar, è sufficiente importare il tratto e usarlo:

use App\Traits\HasGravatar; 

class User extends Model 
{ 
    use HasGravatar; 
} 

Se il modello non dispone di un email colonna/attributo, semplicemente ignorare l'impostazione predefinita impostando nel costruttore del modello come così:

public function __construct() { 
    // override the HasGravatar Trait's gravatarEmail property 
    $this->gravatarEmail = 'email_address'; 
} 
+1

Eccellente! Sì, sicuramente consiglierei un approccio basato sui Tratti ora, dopo aver lavorato con Laravel per due anni. Grazie per aver condiviso @anderly! – Wogan