2015-07-26 15 views
5

sah ich ein paar Stunden Laracast und jetzt mein erstes Laravel Projekt, das ich baue. Ich habe ein paar beredte Modelle mit Zeitstempeln für created_at und updated_at.Laravel 5 global Datum Accessor

Für das richtige Datumsformat anzuzeigen Laravel eine sehr schöne Funktionalität hat: Accessoren. Aber in jedem Eloquent Modell habe ich jetzt 2-Funktionen wie folgt aus:

public function getUpdatedAtAttribute($value) { 
    return Carbon::parse($value)->format('d-m-Y H:i:s'); 
} 
public function getCreatedAtAttribute($value) { 
    return Carbon::parse($value)->format('d-m-Y H:i:s'); 
} 

diese Weise wird das Datum als d-m-Y H:i:s zu zeigen, gezwungen wird. Das einzige Problem ist: Ich möchte das nicht für jedes Modell, das ich erstelle, machen.

Gibt es einen Standard-Laravel-Weg/Konvention, kann ich dies global tun oder sollte ich nur eine Art von MasterModel machen und diese stattdessen erweitern von Model?

+1

Werfen Sie einen Blick at-- http://laravel.com/docs/5.0/helpers – user4621032

+0

eine Hauptklasse machen und Ihre Modelle von Haupt – user3786134

Antwort

5

Zunächst einmal brauchen Sie nicht Accessor bieten das Datumsformat zu ändern. Es ist genug, um die $ Datumsformat Variable in Ihrem Modell zu setzen, zum Beispiel: http://php.net/manual/en/function.date.php

Zweitens, wenn Sie die $ nicht festlegen möchten:

class User extends Model { 
    protected $dateFormat = 'U'; // this will give you a timestamp 
} 

Sie mehr über die verfügbaren Formate hier lesen Datumsformat Variable für alle Modelle, dort gesetzt und machen sie alle Ihre Modelle erweitern die Klasse:

class BaseModel extends Illuminate\Database\Eloquent\Model { 
    protected $dateFormat = 'U'; 
} 

class User extends BaseModel { 
    ... 
} 
+2

erben Das ist die Schönheit der OOP –

+0

Warum diese schöne OOP ist? Vererbung für die gemeinsame Nutzung von Eigenschaften ist eine schlechte Übung. – schellingerht

+0

Erstellen einer Elternklasse nur dafür ist schlecht. Verwenden Sie stattdessen ein Merkmal. – kjdion84

5

ich war für den gleichen suchen, aber leider konnte keinen Weg finden, einen globalen Accessor zu erstellen.

Das „Problem“ mit dem Datumsformat Eigenschaft ist, dass es ein Mutator ist, nicht ein Accessor. Und das Erweitern einer Basisklasse funktioniert nicht für das Benutzermodell und andere Modelle, da es Authenticatable und nicht das Model direkt erweitert.

Hier ist, was ich als die nächstbeste Sache tat - ich FormatsDates Merkmal erstellt. Mit Ihren Methoden:

trait FormatsDates 
{ 
    protected $newDateFormat = 'd-m-Y H:i:s'; 

    public function getUpdatedAtAttribute($value) { 
     return Carbon::parse($value)->format($this->newDateFormat); 
    } 

    public function getCreatedAtAttribute($value) { 
     return Carbon::parse($value)->format($this->newDateFormat); 
    } 
} 

Jetzt kann ich dieses Merkmal auf jedem Modell verwenden, das ich will. z.B. Das Benutzermodell:

class User extends Authenticatable 
{ 
    use FormatsDates; 
} 

Vielleicht findet jemand das nützlich.

+0

Wo genau haben Sie diesen Merkmalscode abgelegt ... in welcher Datei? – lewis4u

+0

Wo immer Sie wollen. In meinem Fall ist es in 'app \ Models \ Support \ FormatsDates.php'. – Koby