想象一下,您的网站上有一些带有日期选择器的日期输入字段。 在交付完整的项目后,客户会返回请求:“顺便说一下,日期格式应为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'
});
现在,作为一个完整的结果,如果我们需要在所有项目中更改日期格式,我们要做的就是更改config/app.php
文件中的变量。