想象一下,您的網站上有一些帶有日期選擇器的日期輸入字段。 在傳遞完整的項目後,客戶會傳回請求:“順便說一下,日期格式應為m / d / y”。 各種形式都有很大的變化,是嗎?
那麼如何在項目一開始就防止這種情況呢? 如何使資料庫,日期選擇器和所有視圖中的日期格式都易于配置?
最大的問題是日期格式在三個地方處理:
- 資料庫應始終為YYYY-MM-DD;
- Laravel後端:在表單/視圖中,我們應該具有用戶端想要的任何格式,但是在儲存到資料庫時應将其轉換為YYYY-MM-DD;
- JavaScript datepicker:日期的JS格式與PHP格式不同,我們将在下面的示例中看到。
那麼,如何同步所有這些呢?
首先,讓它全部正常運作,然後讓它可配置。
JavaScript Datepicker Format
在此示例文章中,我們将以Bootstrap Datepicker為例。
為了使其工作,我們需要以下代碼部分:
<link href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.47/css/bootstrap-datetimepicker.min.css" rel="stylesheet" />
...
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datetimepicker/4.17.47/js/bootstrap-datetimepicker.min.js"></script>
<script>
$(document).ready(function () {
$('.date').datetimepicker({
format: 'MM/DD/YYYY',
locale: 'en'
});
</script>
如您所見,我們傳遞的格式為MM / DD / YYYY,在PHP Date格式中,該格式為m / d / Y。
結果是這樣的:
将日期儲存到資料庫
如果我們将表單資料過帳到某個Controller,則會獲得與datepicker完全相同的日期。 而且,如果嘗試将其以m / d / Y的形式直接儲存到資料庫中,則會收到SQL錯誤。
是以,我們需要将其轉換為正确的格式。 我們可以在幾個地方做到這一點。
選項1. TransactionController store()方法:
public function store(Request $request)
{
$data = $request->all();
$data['transaction_date'] = Carbon::createFromFormat('m/d/Y', $request->transaction_date)->format('Y-m-d');
$transaction = Transaction::create($data);
}
這種方法的問題是,您必須在update()方法中執行相同的操作,并且需要在任何地方存儲該資料。 這是更靈活的方法。
選項2. Model Mutator app / Transaction.php:
public function setTransactionDateAttribute($value)
{
$this->attributes['transaction_date'] = Carbon::createFromFormat('m/d/Y', $value)->format('Y-m-d');
}
在表單/視圖中顯示日期
好的,我們以Y-m-d格式将日期儲存在資料庫中。 但是對于使用者而言,從視覺上看,它始終應該是m / d / Y。 是以,類似于上面的示例,我們需要在Model上建立通路器。
app/Transaction.php:
public function getTransactionDateAttribute($value)
{
return Carbon::parse($value)->format('m/d/Y');
}
使其可配置
對于以上所有示例,我們需要使用config中的值替換确切的格式。
是以,我們将這些變量添加到
config/app.php
中:
return [
'date_format' => 'm/d/Y',
'date_format_javascript' => 'MM/DD/YYYY',
];
- 然後,在Laravel中,我們可以使用以下代碼:
Carbon::createFromFormat(config('app.date_format'), $value)->format('Y-m-d');
Carbon::parse($value)->format(config('app.date_format'));
最後,我們無法在JavaScript中插入變量,但是可以在Blade檔案中添加該腳本指令,然後執行以下操作:
$('.date').datetimepicker({
format: '{{ config('app.date_format_javascript') }}',
locale: 'en'
});