2015-07-12 5 views
7

Ich baue eine API und ich möchte alle meine Zeitstempel wie created_at, deleted_at, ... und so weiter als komplexe Objekte einschließlich der tatsächlichen datetime, aber auch der Zeitzone zurückgeben. Ich verwende bereits {Carbon/Carbon} in meinem Controller. Ich habe mein Datumsfeld auch im Modell definiert. Wenn ich auf die Datumsfelder in meinem Controller zugreife, erhalte ich tatsächlich Carbon-Objekte. Aber wenn ich mein Ergebnis als JSON zurückgebe, sehe ich nur die Datetime-Zeichenfolge. Nicht die Zeitzone.Laravel 5 return datetime mit Zeitzone

Aktuelle 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": [] 
} 

Mein Wunsch :)

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

Jede Idee, was ich hier fehlt?

+0

Ich glaube, Sie könnten dies tun, indem Sie Ihre authdate Accessor ändern, aber bewusst sein, Das würde den Zugriff auf Ihr Datum in Ihrer gesamten Anwendung ändern. Für eine spezifischere Änderung bei Ihrem bestimmten API-Aufruf können Sie dies in Ihrem Controller oder einer Anzeigeklasse behandeln, die das Kohlenstoffobjekt übernimmt und das 2-Punkt-Array generiert. – alariva

Antwort

0

Dies liegt daran, alle Carbon Objekte eine __toString() Funktion haben, die ausgelöst wird, wenn Sie versuchen, das Objekt in einen String (dh JSON zu konvertieren). Versuchen Sie herauszufinden, ob Sie in Ihrem Modell einen eigenen Accessor erstellen können, der Ihnen ein benutzerdefiniertes Array anstelle einer Zeichenfolge bietet.

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

als Benutzer Alariva weist darauf hin, diese Methode wird Ihr Standard-Weg authdate des Zugriffs außer Kraft setzen; Wenn Sie auf Ihr ursprüngliches Carbon Objekt zugreifen möchten, müssen Sie vielleicht eine spezielle Methode dafür erstellen.

Oder Sie könnten ein bisschen klug und tun so etwas wie dieses:

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

Dann das ursprüngliche Objekt zuzugreifen: $carbon = $this->authdate['datetime']

0

Sie können versuchen, in Ihrem Modell eine Funktion wie folgt ergänzt:

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