Я бы хотел, чтобы мое приложение Laravel 6.x принимало и возвращало даты, соответствующие ISO8601, через свой API, продолжая сохранять их в формате базы данных MySQL по умолчанию, который равен Y-m-d H:i:s
. Подвох в том, что ни при каких обстоятельствах я не буду устанавливать мутаторы / аксессоры для каждого свойства, связанного с датой, в моем приложении. Это то, для чего предназначен массив protected $dates
, и это не будет наилучшей практикой, поскольку он сильно дублирует код.
Я смог убедиться, что приложение возвращает даты для клиент в формате ISO8601, переопределяя функцию serializeDate
в Model.php
следующим образом:
/**
* Prepare a date for array/JSON serialization by casting it to an ISO8601-conforming string. This overrides the
* Eloquent `Model` class definition for `serializeDate`.
*
* @param DateTimeInterface $date
*
* @return string - An ISO8601 string representing the date stored in the database.
*/
protected function serializeDate(DateTimeInterface $date)
{
return Carbon::instance($date)->toIso8601String();
}
и предоставляя мои даты в виде строк в массиве Model.php
$dates
:
/**
* Attributes that should be mutated into dates.
*
* @var array
*/
protected $dates = [
'beganAt',
'completedAt'
];
К сожалению, я все еще не могу отправить строки даты, совместимые с ISO8601, в приложение с клиента. Например, отправив:
{
"someDate": "2020-04-10T06:47:43.356Z"
}
результаты с Laravel, более конкретно, Carbon, отвечая:
{
"message": "Unexpected data found. Trailing data",
"exception": "InvalidArgumentException",
"file": "/var/www/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php",
"line": 623
}
Я попытался установить свойство $dateFormat
для Model.php
к DATE_ATOM
, c
и DATE_ISO8601
безуспешно, я попытался переопределить метод getDateFormat()
, и я даже попытался переопределить многие из методов в HasAttributes.php
trait.
Итак, как я go об этом?