2015-07-12 3 views
7

Я создаю API, и я хотел бы вернуть все мои временные метки, такие как created_at, deleted_at, ... и т. Д. Как сложные объекты, включая фактическое время и время, а также часовой пояс. Я уже использую {Carbon/Carbon} в моем контроллере. Я также определил свое поле даты в модели. Когда я получаю доступ к полям даты в моем контроллере, я фактически получаю объекты Carbon. Но когда я возвращаю свой результирующий набор как JSON, я вижу только строку datetime. Не часовой пояс.Laravel 5 return datetime с часовым поясом

Текущий 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": [] 
} 

Мое желание :)

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

Любая идея, что я здесь отсутствует?

+0

Я полагаю, вы могли бы сделать это, изменив authdate аксессор, но быть в курсе что изменит доступ к вашей дате во всей вашей заявке. Для более конкретных изменений в вашем конкретном вызове API вы можете справиться с этим в своем контроллере или с помощью класса отображения, который берет объект углерода и генерирует массив 2 элементов, который вы будете использовать. – alariva

ответ

0

Это происходит потому, что все Carbon объекты имеют __toString() функцию, которая в настоящее время срабатывает при попытке преобразовать объект в строку (т.е. JSON). Попытайтесь увидеть, можете ли вы создать свой собственный аксессуар на своей модели, который дает вам настраиваемый массив вместо строки.

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

Как пользователь Alariva указывает, этот метод будет переопределить способ доступа к authdate по умолчанию; поэтому, если вы хотите получить доступ к своему оригинальному объекту Carbon, возможно, вам придется создать для него специальный метод.

Или вы могли бы быть немного умным и сделать что-то вроде этого:

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

Затем, чтобы получить доступ исходный объект: $carbon = $this->authdate['datetime']

0

Вы можете попробовать добавить функцию, как это внутри вашей модели:

public function getAuthDateAttribute() { 
    return [ 
    "datetime" => "2015-05-27 12:31:13", 
    "timezone" => "UTC+2" 
];} 
Смежные вопросы