Laravel、Carbon 和验证
Posted
技术标签:
【中文标题】Laravel、Carbon 和验证【英文标题】:Laravel, Carbon, and Validations 【发布时间】:2017-08-01 05:55:21 【问题描述】:我在 Laravel 4 和 Carbon 中遇到了一个奇怪的验证问题。
我有一个表单,顶部有一些必需的常规字段(几个下拉菜单和一个文本字段),然后是一系列不需要的日期和时间字段。
我有一个验证器设置为需要前 3 个字段,并且日期/时间字段设置为 'date_format:Y-m-d H:i'(秒在这里并不重要)。
下面的“airline_open”、“airline_close”、“hotel_open”、“hotel_close”字段是导致问题的原因。
只要填写了必填字段,一切正常。如果未填写必填字段,并且没有填写日期/时间字段,那也很好(我会收到适当的消息)。但是,如果未填写任何必填字段,并且使用预期格式(无秒)填写任何日期/时间字段,我会收到 Carbon 引发的异常。 (有趣的是,如果我包括时间的秒数,它不会抛出异常,但会给出验证错误。)
这个异常好像和这个问题类似:Laravel Carbon Data Missing
但是,只要填写了必填字段,一切都会按设计进行,感觉我应该能够完成这项工作,而不必弄乱 Carbon 的日期格式。
有什么想法吗?
添加一些代码:
验证器:
'direction' => 'required',
'type' => 'required',
'notes' => 'required',
'callback_time' => 'date_format:H:i',
'callback_time2' => 'required_if:callback_type, 4|date_format:H:i',
'airline_open' => 'date_format:Y-m-d H:i',
'airline_close' => 'date_format:Y-m-d H:i',
'hotel_open' => 'date_format:Y-m-d H:i',
'hotel_close' => 'date_format:Y-m-d H:i'
);
来自表单(airline_open 和airline_close 字段)。 “现在”按钮调用一些 js 以所需格式使用日期和时间填充字段:
<tr class="airline-reservation @if ($data->airline_reservation == 0) _hide @endif">
<td > trans('nationalbank.call.form.open') :</td>
<td >
<input type="text" class="form-control" name="airline_open" id="airline_open" @if ($data->airline_open > 0)) value=" Carbon\Carbon::createFromFormat('Y-m-d H:i:s',$data->airline_open)->format('Y-m-d H:i') " @endif size="30">
<a href="javascript:;" class="btn btn-info btn-xs nowbtn" id="now-airline_open">now</a>
</td>
<td > trans('nationalbank.call.form.close') :</td>
<td >
<input type="text" class="form-control" name="airline_close" id="airline_close" @if ($data->airline_close > 0)) value=" Carbon\Carbon::createFromFormat('Y-m-d H:i:s',$data->airline_close)->format('Y-m-d H:i') " @endif size="30">
<a href="javascript:;" class="btn btn-info btn-xs nowbtn" id="now-airline_close">now</a>
</td>
</tr>
Screenshot of error:
【问题讨论】:
显示一些代码。 此外,如果我更改字段验证和格式以包含秒数,但从字段中的时间中删除秒数,我仍然会抛出异常。如果我输入垃圾(非日期/时间文本),我会按预期收到验证错误,但“不完整”的日期/时间(例如,删除时间并只留下日期)会引发异常。 请发布您遇到的确切错误。该错误可能与保存日期而不是验证日期有关。 我附上了上面错误的截图。消息是“数据丢失(查看:/var/www/novus-calltracker-2/app/modules/nationalbank/views/call/form.blade.php)” 【参考方案1】:验证失败,因为您无法将此类日期保存在需要解析的数据库中。
我建议首先将模型中的日期字段放在 $dates 变量下
protected $dates = ['your_date'];
然后做一个setter和getter:
// save the date in UTC format in DB table
public function setYourDateAttribute($date)
$this->attributes['your_date'] = Carbon::parse($date);
// convert the UTC format to my format
public function getYourDateAttribute()
return Carbon::parse($this->attributes['your_date'])->format('d.m.Y H:i');
【讨论】:
但是如果我填充了必填字段,它确实可以很好地保存在我的数据库中(秒总是设置为 00)。请参阅上面我在键入此代码时添加的代码,了解我如何处理日期的显示。 问题与验证无关。我已经发布了一个合适的解决方案。【参考方案2】:该错误与您视图中的代码form.blade.php
有关。
您在哪里调用以下内容:
Carbon\Carbon::createFromFormat('Y-m-d H:i:s',$data->airline_open)->format('Y-m-d H:i')
将其更改为:
(new Carbon\Carbon($data->airline_open))->format('Y-m-d H:i')
对使用 Carbon 的两条线都这样做,它应该可以解决问题。
【讨论】:
谢谢!这似乎做到了!以上是关于Laravel、Carbon 和验证的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 在 where 子句中更改日期格式以匹配 Carbon::now()