2015-07-12 13 views
7

Buduję API i chciałbym zwrócić wszystkie moje znaczniki czasu, takie jak created_at, deleted_at, ... i tak dalej, jak złożone obiekty, w tym rzeczywistą datetime, ale także strefę czasową. Używam już {Węgiel/węgiel} w moim kontrolerze. Również zdefiniowałem pole daty w modelu. Po uzyskaniu dostępu do pól daty w moim kontrolerze, faktycznie otrzymuję obiekty węglowe. Ale gdy zwracam mój zestaw wyników jako JSON, widzę tylko ciąg datetime. Nie strefa czasowa.Laravel 5 powrót datetime z timezone

Aktualny JSON

{ 
    "id": 4, 
    "username": "purusScarlett93", 
    "firstname": null, 
    "lastname": null, 
    "language_id": 1, 
    "pic": null, 
    "email": null, 
    "authtoken": "f54e17b2ffc7203afe345d947f0bf8ceab954ac4f08cc19990fc41d53fe4eef8", 
    "authdate": "2015-05-27 12:31:13", 
    "activation_code": null, 
    "active": 0, 
    "devices": [], 
    "sports": [] 
} 

Życzę :)

{ 
    "id": 4, 
    "username": "purusScarlett93", 
    "firstname": null, 
    "language_id": 1, 
    "pic": null, 
    "email": null, 
    "authtoken":"f54e17b2ffc7203afe41d53fe4eef8", 
    "authdate": [ 
    { 
     "datetime": "2015-05-27 12:31:13", 
     "timezone": "UTC+2" 
    } 
    ], 
    "activation_code": null, 
    "active": 0 
} 

Każdy pomysł co ja tu brakuje?

+0

wierzę można to zrobić zmieniając authdate akcesor, ale należy pamiętać, to zmieni dostęp do Twojej daty w całej aplikacji. Aby uzyskać bardziej szczegółową zmianę w twoim konkretnym wywołaniu API, możesz obsłużyć to w kontrolerze lub przez klasę wyświetlania, która pobiera obiekt węgla i generuje tablicę 2 itemów, którą będziesz. – alariva

Odpowiedz

0

To dlatego wszystkie Carbon obiekty mają __toString() funkcję, która jest uruchamiany podczas próby przekonwertować obiekt na ciąg znaków (tj JSON). Spróbuj sprawdzić, czy możesz utworzyć własny akcesor w modelu, który daje niestandardową tablicę zamiast łańcucha.

public function getAuthdateAttribute(Carbon $authdate) { 
    return [ 
      'datetime' => $authdate->toDateTimeString(), 
      'timezone' => 'UTC' . $authdate->offsetHours 
      ]; 
} 

Jak Alariva użytkownik wskazuje, metoda ta zastąpi domyślny sposób dostępu authdate; więc jeśli chcesz uzyskać dostęp do oryginalnego obiektu Carbon, być może będziesz musiał stworzyć dla niego specjalną metodę.

Lub może być nieco mądry i zrobić coś takiego:

public function getAuthdateAttribute(Carbon $authdate) { 
    return [ 
      'datetime' => $authdate, 
      'timezone' => 'UTC' . $authdate->offsetHours 
      ]; 
} 

Następnie dostępu do oryginalnego obiektu: $carbon = $this->authdate['datetime']

0

Można spróbować dodać funkcję tak wewnątrz modelu

public function getAuthDateAttribute() { 
    return [ 
    "datetime" => "2015-05-27 12:31:13", 
    "timezone" => "UTC+2" 
];}