2015-07-26 21 views
5

Oglądałem kilka lekcji z Laracast, a teraz buduję swój pierwszy projekt Laravel. Mam kilka Eloquent modeli ze znacznikami czasu dla created_at i updated_at.Laravel 5 data globalna accessor

Do wyświetlania odpowiedniego formatu daty Laravel ma bardzo przyjemną funkcję: akcesory. Ale w każdym wymowny modelu Mam teraz 2 funkcje tak:

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'); 
} 

ten sposób data zostanie zmuszony, aby pokazać jak d-m-Y H:i:s. Jedyny problem to: nie chcę tego robić dla każdego tworzonego przeze mnie Modelu.

Czy istnieje domyślny sposób/konwencja Laravel mogę to zrobić na całym świecie, czy powinienem po prostu zrobić coś w rodzaju MasterModel i rozszerzyć to zamiast z Model?

+1

Sprawdźcie at-- http://laravel.com/docs/5.0/helpers – user4621032

+0

uczynić główną klasę i dziedziczą swoje modele od głównego – user3786134

Odpowiedz

5

Po pierwsze, nie trzeba udostępniać narzędzia do zmiany formatu daty. To wystarczy, aby ustawić dateformat zmienną $ w modelu, np:

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

można przeczytać więcej na temat dostępnych formatów tutaj: http://php.net/manual/en/function.date.php

Po drugie, jeśli nie chcesz, aby ustawić $ dateformat zmiennej dla wszystkich modeli, ustaw go tam i zrobić wszystkie modele rozszerzyć tę klasę:

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

class User extends BaseModel { 
    ... 
} 
+2

To piękno OOP –

+0

Dlaczego jest to piękny OOP? Dziedziczenie tylko w przypadku udostępniania właściwości jest złą praktyką. – schellingerht

+0

Tworzenie klasy rodzicielskiej właśnie w tym celu jest złe. Zamiast tego użyj cechy. – kjdion84

5

szukałem to samo, ale niestety nie mógł wymyślić sposobu na stworzenie globalnego akcesorium.

"Problem" z właściwością dateFormat polega na tym, że jest to mutator, a nie akcesor. Rozszerzenie klasy bazowej nie działa zarówno dla modelu użytkownika, jak i innych modeli, ponieważ rozszerza Authenticatable, a nie model bezpośrednio.

Oto co zrobiłem jako następną najlepszą rzecz - stworzyłem cechę FormatsDates. Twoimi metodami:

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

Teraz mogę używać tej cechy na dowolnym modelu. na przykład Model użytkownika:

class User extends Authenticatable 
{ 
    use FormatsDates; 
} 

Może ktoś uzna to za przydatne.

+0

Gdzie dokładnie umieściłeś ten kod cechy ... w którym pliku? – lewis4u

+0

Gdziekolwiek chcesz. W moim przypadku jest to w 'app \ Models \ Support \ FormatsDates.php'. – Koby