2015-07-12 23 views
7

Sto costruendo un'API e vorrei restituire tutti i miei timestamp come created_at, deleted_at, ... e così via come oggetti complessi incluso il datetime effettivo, ma anche il fuso orario. Sto già utilizzando {Carbon/Carbon} nel mio controller. Ho definito anche il mio campo data nel modello. Quando accedo ai campi data nel mio controller, ottengo effettivamente oggetti Carbon. Ma quando restituisco il mio set di risultati come JSON, vedo solo la stringa datetime. Non il fuso orario.Laravel 5 restituisce datetime con fuso orario

JSON attuale

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

Il mio desiderio :)

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

Qualsiasi idea di cosa mi manca qui?

+0

Credo che si possa fare questo cambiando la vostra di accesso authdate, ma essere consapevoli questo cambierebbe l'accesso della tua data nella tua intera applicazione. Per una modifica più specifica sulla tua particolare chiamata API potresti gestirla nel tuo controller, o da una classe di visualizzazione che prende l'oggetto carbone e genera l'array di 2 elementi che vuoi. – alariva

risposta

0

Questo perché tutti Carbon gli oggetti hanno una funzione __toString() che viene attivato quando si tenta di convertire l'oggetto in una stringa (ad esempio JSON). Prova a vedere se puoi creare il tuo accessor sul tuo modello che ti dà una matrice personalizzata invece di una stringa.

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

Come sottolinea Alariva utente, questo metodo avrà la precedenza il vostro modo di default di accesso authdate; quindi se vuoi accedere al tuo oggetto originale Carbon forse dovrai creare un metodo speciale per quello.

Oppure si potrebbe essere un po 'intelligente e fare qualcosa del genere:

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

Poi di accedere all'oggetto originale: $carbon = $this->authdate['datetime']

0

Si può provare ad aggiungere una funzione come questa all'interno del vostro modello:

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