
本文介绍如何将 DHL API 返回的物流轨迹数据(含时间戳)在 Laravel Blade 模板中按日期分组展示,通过 Collection 的 groupBy 方法实现清晰的时间轴布局。
本文介绍如何将 dhl api 返回的物流轨迹数据(含时间戳)在 laravel blade 模板中按日期分组展示,通过 collection 的 `groupby` 方法实现清晰的时间轴布局。
在构建物流跟踪页面时,原始 API 数据通常包含带完整时间戳(如 "2024-05-20T08:32:15+00:00")的多条记录。若直接使用 @foreach 遍历,所有记录将平铺显示,缺乏日期归类,用户体验远不如 DHL 官网那样按天折叠展示(如“2024-05-20”下聚合当日全部事件)。
推荐方案:在控制器中预处理分组(最佳实践)
避免在 Blade 中混入复杂逻辑,应在后端完成数据组织:
// 在 Controller 中
use Illuminate\Support\Facades\Http;
use Carbon\Carbon;
public function show($trackingNumber)
{
$response = Http::get("https://api.dhl.com/track/shipments?trackingNumber={$trackingNumber}");
$data = $response->json('shipments.0.events') ?? [];
// 按日期(Y-m-d)分组,同时确保时间戳可解析
$groupedEvents = collect($data)->groupBy(function ($event) {
return Carbon::parse($event['timestamp'] ?? now())->format('Y-m-d');
})->sortKeysDesc(); // 倒序:最新日期在前
return view('tracking.show', compact('groupedEvents'));
}Blade 模板中简洁渲染:
{{-- resources/views/tracking/show.blade.php --}}
@foreach($groupedEvents as $date => $events)
<div class="timeline-day mb-6">
<h3 class="text-lg font-semibold text-gray-800">{{ \Carbon\Carbon::parse($date)->format('M j, Y') }}</h3>
<div class="mt-3 space-y-3">
@foreach($events as $event)
<div class="flex items-start">
<div class="flex-shrink-0 w-3 h-3 rounded-full bg-blue-500 mt-2 mr-3"></div>
<div>
<p class="font-medium">{{ $event['description'] ?? 'Unknown event' }}</p>
<p class="text-sm text-gray-600">
{{ \Carbon\Carbon::parse($event['timestamp'])->format('g:i A') }}
@isset($event['location'])
— {{ $event['location']['address']['country'] ?? '' }}
@endisset
</p>
</div>
</div>
@endforeach
</div>
</div>
@endforeach⚠️ 注意事项:
- 始终对 $event['timestamp'] 做空值/格式校验,避免 Carbon::parse() 报错;建议在分组前用 filter() 清洗无效项。
- 若坚持在 Blade 中分组(不推荐),需引入 @php 块并确保已 use Carbon\Carbon 或使用 \Carbon\Carbon::parse() 全限定名。
- 分组键建议统一为 'Y-m-d' 格式,便于排序与语义化展示;前端显示时再用 Carbon 格式化为友好日期(如 “May 20, 2024”)。
- 性能敏感场景下,避免在视图中执行集合操作——控制器预处理既提升可测试性,也利于缓存与错误隔离。
通过这种结构化分组,你将获得与 DHL 官网一致的专业物流时间轴,兼顾可维护性与用户体验。

















