讲师中心 微信公众号
AI工具推荐 视频效率加速

Laravel 8 + FullCalendar 集成问题排查与完整实现教程

落雪小哥_6155

落雪小哥_6155

发布时间:2026-08-06 14:42:22

|

792人浏览过

|

来源于php中文网

原创

Laravel 8 + FullCalendar 集成问题排查与完整实现教程

本文详解 laravel 8(兼容 php 8)中 fullcalendar 数据不渲染的根本原因,涵盖事件数据格式校验、ajax 配置冲突修复、时间字段标准化处理及安全初始化实践。

本文详解 laravel 8(兼容 php 8)中 fullcalendar 数据不渲染的根本原因,涵盖事件数据格式校验、ajax 配置冲突修复、时间字段标准化处理及安全初始化实践。

在将 Laravel 应用从 PHP 7 升级至 PHP 8 后,许多开发者遇到 FullCalendar 事件无法显示的问题——数据库能正常查询,视图也成功传入 $data,但日历界面始终空白。这并非 PHP 版本兼容性 bug,而是由事件数据结构不满足 FullCalendar v3.x 要求、重复/冲突的 events 配置项以及时间格式未严格遵循 ISO 8601 标准共同导致。

? 根本问题定位

原代码中存在两个关键错误:

  1. events 属性被重复定义:

    Laravel Creem Agent
    Laravel Creem Agent

    Creem 支付商店助理 — 查询订阅、客户、交易、产品,执行心跳检查,管理本地 Laravel支付商店。

    下载
    events: "{{ route('kkalender.index') }}", // ❌ 错误:字符串 URL 不会被自动解析为事件数组
    // ... 后续又定义了:
    events: [ @foreach ($data as $value) { ... } ], // ✅ 正确:内联渲染 JSON 数组

    FullCalendar 会以后声明的 events 覆盖前一个。由于第一行传入的是字符串路径而非有效事件源(如 AJAX endpoint),而第二行才是真实数据,但因语法或上下文错误(如未转义引号、XSS 过滤干扰),实际渲染失败。

  2. 事件对象缺少必需字段:
    FullCalendar v3.x 要求每个事件必须包含 id、title、start(必填)、end(可选,但推荐提供)。原代码中:

    • 缺失 id: '{{ $value->id }}' → 导致事件无法被识别、拖拽、删除;
    • 使用 dari/sampai 字段名而非标准 start/end → FullCalendar 忽略非标准键;
    • allDay 未显式传递布尔值,仅依赖 eventRender 动态修正,不可靠。

✅ 正确实现方案(Laravel 8 + PHP 8 兼容)

1. 控制器:确保数据结构规范

// app/Http/Controllers/K_JadwalController.php
public function index()
{
    // 显式选择必要字段,并确保时间格式为 'Y-m-d H:i:s'
    $events = K_Jadwal::select('id', 'kategori as title', 'dari as start', 'sampai as end')
        ->whereNotNull('dari')
        ->get()
        ->map(function ($event) {
            // 强制转换为 Carbon 实例并格式化,避免时区/字符串解析异常
            $event->start = \Carbon\Carbon::parse($event->start)->format('Y-m-d\TH:i:s');
            $event->end = $event->end ? \Carbon\Carbon::parse($event->end)->format('Y-m-d\TH:i:s') : null;
            return $event;
        });

    return view('kkalender.index', compact('events'));
}

2. Blade 模板:安全内联渲染事件数组

{{-- resources/views/kkalender/index.blade.php --}}
<script>
$(document).ready(function() {
    var bg_task = ["bg-teal", "bg-purple", "bg-warning", "bg-muted", "bg-primary", "bg-success", "bg-brown", "bg-pink", "bg-info"];

    $('#calendar').fullCalendar({
        header: {
            left: 'prev,next today',
            center: 'title',
            right: 'month,agendaWeek,agendaDay'
        },
        editable: true,
        selectable: true,
        defaultView: 'month',
        // ✅ 关键:直接使用内联 JSON,避免 AJAX 冲突
        events: [
            @foreach($events as $e)
                {
                    id: {{ $e->id }},
                    title: "{{ addslashes($e->title) }}",
                    start: "{{ $e->start }}",
                    end: {{ $e->end ? '"' . $e->end . '"' : 'null' }},
                    className: bg_task[Math.floor(Math.random() * bg_task.length)]
                }@if(!$loop->last),@endif
            @endforeach
        ],
        eventClick: function(event) {
            if (confirm('确定删除该日程?')) {
                $.post("{{ route('kkalender.fullcalenderAjax') }}", {
                    _token: "{{ csrf_token() }}",
                    id: event.id,
                    type: 'delete'
                }).done(function() {
                    $('#calendar').fullCalendar('removeEvents', event.id);
                    toastr.success('删除成功!');
                });
            }
        }
    });
});
</script>

⚠️ 注意事项:

  • 使用 addslashes() 防止标题中的单引号破坏 JS 字符串;
  • @if(!$loop->last),@endif 确保 JSON 数组末尾无多余逗号(IE 兼容);
  • 时间格式必须为 Y-m-d\TH:i:s(如 2024-05-20T09:00:00),\T 是 ISO 8601 标准分隔符,不可省略。

3. 路由与资源管理(推荐 Resource 路由)

// routes/web.php
Route::resource('kkalender', K_JadwalController::class)->except(['show']);
Route::post('kkalender/fullcalenderAjax', [K_JadwalController::class, 'ajax'])->name('kkalender.fullcalenderAjax');

4. 前端资源加载优化(避免 CDN 冲突)

移除混合 CDN 加载(如同时引入 cdnjs 和本地 fullcalendar.min.js),统一使用本地资源:

<!-- 仅保留一组 -->
<link rel="stylesheet" href="{{ asset('assets/plugins/fullcalendar/css/fullcalendar.min.css') }}">
<script src="{{ asset('assets/plugins/moment/moment.min.js') }}"></script>
<script src="{{ asset('assets/plugins/fullcalendar/js/fullcalendar.min.js') }}"></script>

? 验证与调试技巧

  • 在浏览器控制台执行 console.log({{ $events->toJson() }}),确认输出为合法 JSON 数组;
  • 检查 Network 面板,确保无 419/500 报错,CSRF Token 已正确注入;
  • 使用 fullCalendar('clientEvents') 查看当前渲染的事件列表;
  • 若仍为空,临时将 events 设为静态测试数据:
    events: [{ id:1, title:'Test', start:'2024-05-20T10:00:00' }]

✅ 总结

Laravel 8 + PHP 8 下 FullCalendar 事件不显示,本质是数据契约未对齐。解决方案核心在于:
① 控制器返回严格符合 id/title/start/end 结构的集合;
② Blade 中安全内联渲染(非 AJAX 请求);
③ 时间字段强制 ISO 8601 格式(Y-m-d\TH:i:s);
④ 移除重复 events 配置,杜绝覆盖逻辑。
遵循以上步骤,即可在 PHP 8 环境下稳定运行 FullCalendar,无需降级或更换插件。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

9544

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

5741

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2055

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

3588

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

4274

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

3351

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4757

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

3722

2023.11.13

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

0

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 192人学习

Composer手册
Composer手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn