2014-05-18 8 views
14

Was ist der schnellste Weg um Gravatar URLs in Laravel zu implementieren? Ich habe ein obligatorisches E-Mail-Adressfeld, aber ich möchte keine neue Spalte für Gravatars erstellen, und ich würde lieber die nativen Attribute Auth::user() verwenden.Wie implementiere ich Gravatar in Laravel?

Antwort

32

Es stellt sich heraus, dass Sie einen Laravel-Mutator verwenden können, um Attribute zu erstellen, die in Ihrem Modell nicht vorhanden sind. Angenommen, Sie haben ein User Modell mit einer obligatorischen email Spalte in der entsprechenden users Tabelle, nur Stick dies in Ihrem User Modell:

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

Nun, wenn Sie dies tun:

Auth::user()->gravatar 

Sie erhalten die gravatar.com URL, die Sie erwarten. Ohne eine Gravatar-Spalte, Variable, Methode oder irgendetwas anderes zu erstellen.

+0

wow, das ist toll – jhamPac

4

Erweiterung auf Wogan Antwort ein bisschen ...

Ein weiteres Beispiel einer Trait mit:

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"; 
    } 

} 

nun an einem bestimmten Modell (dh Benutzer), wo Sie Gravatar unterstützen wollen, importieren Sie einfach den Zug und es verwendet:

use App\Traits\HasGravatar; 

class User extends Model 
{ 
    use HasGravatar; 
} 

Wenn das Modell nicht hat ein email Spalte/Attribut, außer Kraft setzt einfach den Standard indem sie sie im Konstruktor des Modells einstellen wie so:

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

Ausgezeichnet! Ja, ich würde jetzt definitiv einen Trait-basierten Ansatz empfehlen, nachdem ich zwei Jahre mit Laravel gearbeitet habe. Danke für das Teilen @anderly! – Wogan

Verwandte Themen