You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将AJAX与Laravel 5.5、Mailtrap.io结合实现无刷新提交联系表单

别担心!既然你已经搭好了能正常运行的联系表单、写了AJAX提交逻辑和ContactController,那搞定无刷新提交其实就是把这几部分的交互逻辑理顺就行,我来给你拆解关键步骤:

1. 确保AJAX请求通过Laravel的CSRF验证

Laravel默认开启CSRF保护,AJAX请求必须携带令牌才不会被拒绝,这里有两种常用方式:

方式一:直接在AJAX数据里携带令牌

先确保你的表单里有Laravel生成的CSRF字段(用@csrf Blade指令即可自动生成),然后在AJAX请求中把令牌值传进去:

$('#contact-form').submit(function(e) {
    e.preventDefault(); // 必须阻止表单默认提交行为,避免页面刷新

    $.ajax({
        url: '{{ route("contact.submit") }}', // 用路由名称更可靠
        method: 'POST',
        data: {
            name: $('#name').val(),
            email: $('#email').val(),
            message: $('#message').val(),
            _token: $('input[name="_token"]').val() // 取出CSRF令牌
        },
        success: function(response) {
            // 提交成功后的处理:提示用户+重置表单
            alert('消息发送成功!');
            $('#contact-form')[0].reset();
        },
        error: function(xhr) {
            // 处理验证失败或服务器错误
            let errorMsg = '';
            if (xhr.responseJSON?.errors) {
                $.each(xhr.responseJSON.errors, function(key, value) {
                    errorMsg += value + '\n';
                });
            } else {
                errorMsg = '提交失败,请稍后重试';
            }
            alert(errorMsg);
        }
    });
});

方式二:全局配置AJAX请求头(更优雅)

在页面头部添加CSRF meta标签:

<meta name="csrf-token" content="{{ csrf_token() }}">

然后在JS里全局设置AJAX请求头,这样所有AJAX请求都会自动带上令牌:

$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

之后AJAX的data里就不用单独传_token了。

2. 调整ContactController返回JSON响应

因为是AJAX请求,控制器不能返回视图或重定向,要返回JSON格式的响应,适配前端的回调逻辑:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;

class ContactController extends Controller
{
    public function submit(Request $request)
    {
        // 验证表单数据(规则根据你的需求调整)
        $validated = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email',
            'message' => 'required|string|min:10'
        ]);

        // 发送邮件(你已经配置好Mailtrap,这部分逻辑不用改)
        Mail::send('emails.contact', $validated, function($message) use ($request) {
            $message->from($request->email, $request->name);
            $message->to('your-admin-email@example.com')->subject('新的联系消息');
        });

        // 返回成功的JSON响应
        return response()->json(['success' => '消息已成功发送至Mailtrap!'], 200);
    }
}

如果验证失败,Laravel会自动返回422状态码的JSON错误信息,正好能被AJAX的error回调捕获。

3. 确认路由配置正确

确保你的POST路由指向控制器的submit方法:

// routes/web.php
Route::post('/contact', 'ContactController@submit')->name('contact.submit');
4. 排查问题的小技巧

如果遇到问题,先看浏览器控制台的报错:

  • 419状态码:CSRF令牌未正确携带,检查令牌配置
  • 422状态码:表单验证失败,看响应里的错误信息
  • 500状态码:服务器内部错误,可以在控制器里加日志排查:
\Log::info('联系表单提交数据', $validated);

然后查看storage/logs/laravel.log里的记录,确认邮件发送逻辑是否正常。

另外,Mailtrap的配置你之前已经验证过能正常发送,所以AJAX提交后邮件依然会出现在Mailtrap的收件箱里,不用额外调整Mailtrap的设置。

内容的提问来源于stack exchange,提问作者Jafar Salami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:14:51