Skip to content

Laravel - Ajax

AJAX (Asynchronous JavaScript and XML) 使得 Web 应用能够异步地向服务器发送和检索数据,而不会干扰现有页面的显示和行为。虽然可以使用 XML,但 JSON 现在是更常用的数据交换格式。

Laravel 使处理 AJAX 请求变得简单直接。你通常会使用一个 JavaScript 库,如 jQuery(如原始示例所示)、原生的 fetch API 或更现代的 HTTP 客户端如 Axios,从客户端发起请求。在服务器端,Laravel 控制器可以轻松返回 JSON 响应。

在 Laravel 中使用 AJAX 的关键注意事项:

Section titled “在 Laravel 中使用 AJAX 的关键注意事项:”
  • CSRF 保护 (CSRF Protection): Laravel 会自动防止跨站请求伪造 (Cross-Site Request Forgery)。对于 AJAX 请求,你需要包含 CSRF token。
  • 路由 (Routing): 在 routes/web.php 或 routes/api.php 中定义路由来处理 AJAX 请求。
  • 控制器逻辑 (Controller Logic): 控制器处理请求,通常返回一个 JsonResponse。
  • 错误处理 (Error Handling): 实现客户端和服务器端的错误处理。

Laravel 的 response() 助手函数可以轻松创建 JSON 响应。响应工厂上的 json() 方法将自动设置 Content-Type 头部为 application/json,并将给定的数组转换为 JSON。

response()->json() 的语法:

return response()->json(['key' => 'value', 'another_key' => 'another_value'], 200, $headers, $options);
  • data (array|JsonSerializable): 需要转换为 JSON 的数据。
  • status (int, optional): HTTP 状态码(默认为 200)。
  • headers (array, optional): 自定义 HTTP 头部。
  • options (int, optional): JSON 编码选项(例如,JSON_PRETTY_PRINT)。

示例:在 Laravel 中使用 jQuery AJAX

Section titled “示例:在 Laravel 中使用 jQuery AJAX”

步骤 1:为 AJAX 设置 CSRF Token(客户端)

在你的主 Blade 布局文件(例如,resources/views/layouts/app.blade.php)中,为 CSRF token 添加一个 meta 标签:

<head>
<!-- 其他 head 元素 -->
<meta name="csrf-token" content="{{ csrf_token() }}">
<title>AJAX 示例</title>
</head>

然后,配置 jQuery(或你喜欢的库),以便在所有 AJAX 请求中包含此 token。对于 jQuery:

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
</script>

注意:如果你使用像 Axios 这样的库,它通常有内置的机制或建议来处理 CSRF token(例如,如果 Laravel 配置正确,可以通过读取 XSRF-TOKEN cookie 来获取)。

步骤 2:创建视图 (resources/views/message.blade.php)

Section titled “步骤 2:创建视图 (resources/views/message.blade.php)”

此视图将有一个按钮,点击后会发起一个 AJAX 请求。

@extends('layouts.app') {{-- 假设你有一个布局文件 --}}
@section('content')
<div class="container">
<h1>AJAX 消息更新器</h1>
<div id="message-area" style="padding: 10px; border: 1px solid #ccc; margin-bottom: 10px;">
此消息将通过 Ajax 被替换。点击按钮替换消息。
</div>
<button type="button" id="getMessageButton" class="btn btn-primary">替换消息</button>
</div>
<script>
$(document).ready(function() {
$('#getMessageButton').on('click', function() {
$.ajax({
type: 'POST', // 或 'GET',取决于你的路由
url: '{{ route("ajax.getmessage") }}', // 使用命名路由
// data: { some_param: 'value' }, // 可选的发送数据
dataType: 'json', // 期望接收 JSON 响应
success: function(data) {
$('#message-area').html(data.message);
// console.log('Success:', data);
},
error: function(jqXHR, textStatus, errorThrown) {
$('#message-area').html('Error fetching message: ' + textStatus);
// console.error('Error:', textStatus, errorThrown);
}
});
});
});
</script>
@endsection

步骤 3:创建控制器 (AjaxDemoController)

Section titled “步骤 3:创建控制器 (AjaxDemoController)”
php artisan make:controller AjaxDemoController

步骤 4:向 app/Http/Controllers/AjaxDemoController.php 添加一个方法

Section titled “步骤 4:向 app/Http/Controllers/AjaxDemoController.php 添加一个方法”
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class AjaxDemoController extends Controller
{
public function getMessage(Request $request): JsonResponse
{
// 如果发送了数据,你可以处理 $request->input()
$dynamicMessage = "这是来自服务器的动态加载消息,时间为 " . now()->toTimeString();
return response()->json(['message' => $dynamicMessage]);
}
}
use App\Http\Controllers\AjaxDemoController;
// 用于显示初始页面的路由
Route::get('ajax-demo', function () {
return view('message');
})->name('ajax.demo.page');
// 用于处理 AJAX 请求的路由
Route::post('/get-dynamic-message', [AjaxDemoController::class, 'getMessage'])->name('ajax.getmessage');
  1. 在浏览器中访问 http://your-app.test/ajax-demo。

  2. 你应该看到带有按钮的初始页面。

  3. 点击“替换消息”按钮。message-area div 中的文本应该通过 AJAX 从服务器接收到的消息更新。

实际应用:实时搜索或表单提交

AJAX 常用于以下功能:

  • 实时搜索 (Live search): 当用户在搜索框中输入时,通过 AJAX 请求将数据发送到服务器,并在不重新加载整个页面的情况下获取和显示匹配结果。
  • 表单提交 (Form submissions): 无需刷新页面即可提交表单,提供即时反馈或验证错误信息。
  • 动态内容更新 (Dynamic content updates): 实时加载评论、通知或其他内容更新。

常见学习障碍:CSRF Token 不匹配

如果你遇到 419 CSRF token mismatch 错误,通常意味着在 AJAX 的 POST、PUT、PATCH 或 DELETE 请求中未正确发送 CSRF token。请确保你已设置 meta 标签,并配置你的 JavaScript 库(如 jQuery 的 ajaxSetup 或 Axios 拦截器)以包含 X-CSRF-TOKEN 头部。