我刚刚学习使用 laravel 创建 Rest api 我有表用户、用户模型和身份验证控制器 注册和登录 api 运行良好 当我想更新用户数据(例如:姓名)时,响应返回成功,但数据库中的数据没有更改/更新
这是我的代码
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use App\Models\User;
use MatanYadaev\EloquentSpatial\Objects\Point;
use Tymon\JWTAuth\Facades\JWTAuth;
class AuthController extends Controller
{
// Register a new user
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required|string|max:255',
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:8|confirmed',
'role' => 'required|string|in:user,admin',
'image' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
'address' => 'nullable|string|max:255',
'latitude' => 'nullable|numeric|between:-90,90',
'longitude' => 'nullable|numeric|between:-180,180',
]);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
// Handle image upload
$imagePath = null;
if ($request->hasFile('image')) {
$imagePath = $request->file('image')->store('images', 'public');
}
// Handle location data
$location = null;
if ($request->filled('latitude') && $request->filled('longitude')) {
$longitude = $request->input('longitude');
$latitude = $request->input('latitude');
$location = new Point($longitude, $latitude);
}
// Create the user
$user = User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
'role' => $request->role,
'image' => $imagePath,
'address' => $request->address,
'location' => $location,
]);
// Generate a JWT token for the new user
$token = Auth::login($user);
return response()->json([
'message' => 'User registered successfully',
'user' => $user,
'token' => $token,
], 201);
}
// User login
public function login(Request $request)
{
$validator = Validator::make($request->all(), [
'email' => 'required|string|email',
'password' => 'required|string',
]);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
if (!$token = JWTAuth::attempt($request->only('email', 'password'))) {
return response()->json(['message' => 'Invalid credentials'], 401);
}
return response()->json([
'token' => $token,
]);
}
// User logout
public function logout()
{
Auth::logout();
return response()->json(['message' => 'Successfully logged out']);
}
// Update user profile
public function update(Request $request, $id)
{
$user = User::findOrFail($id);
// Check if the authenticated user is allowed to update this user
if (Auth::user()->role !== 'admin' && Auth::id() !== $user->id) {
return response()->json(['message' => 'Unauthorized'], 403);
}
// Validate the request data
$validator = Validator::make($request->all(), [
'name' => 'sometimes|required|string|max:255',
'email' => 'sometimes|required|string|email|max:255|unique:users,email,' . $user->id,
'password' => 'sometimes|required|string|min:8|confirmed',
'role' => 'sometimes|required|string|in:user,admin',
'image' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
'address' => 'nullable|string|max:255',
'latitude' => 'nullable|numeric|between:-90,90',
'longitude' => 'nullable|numeric|between:-180,180',
]);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
// Update user fields
if ($request->has('name')) {
$user->name = $request->input('name');
}
if ($request->has('email')) {
$user->email = $request->input('email');
}
if ($request->has('password')) {
$user->password = Hash::make($request->input('password'));
}
if ($request->has('role')) {
$user->role = $request->input('role');
}
if ($request->hasFile('image')) {
$imagePath = $request->file('image')->store('images', 'public');
$user->image = $imagePath;
}
if ($request->has('address')) {
$user->address = $request->input('address');
}
// Handle location data
if ($request->filled('latitude') && $request->filled('longitude')) {
$longitude = $request->input('longitude');
$latitude = $request->input('latitude');
$user->location = new Point($longitude, $latitude);
}
// Save updated user data
$user->save();
return response()->json([
'message' => 'User updated successfully',
'user' => $user,
], 200);
}
// Get user details
public function detail($id)
{
$user = User::findOrFail($id);
// Check if the authenticated user is allowed to see this user's details
if (Auth::user()->role !== 'admin' && Auth::id() !== $user->id) {
return response()->json(['message' => 'Unauthorized'], 403);
}
return response()->json($user);
}
// Search for users
public function search(Request $request)
{
// Validate the search query
$validator = Validator::make($request->all(), [
'query' => 'nullable|string|max:255',
'role' => 'nullable|string|in:user,admin',
]);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
// Get the search query and role from the request
$query = $request->input('query');
$role = $request->input('role');
// Start building the query
$users = User::query();
if ($query) {
$users->where(function ($q) use ($query) {
$q->where('name', 'like', "%$query%")
->orWhere('email', 'like', "%$query%");
});
}
if ($role) {
$users->where('role', $role);
}
return response()->json($users->get());
}
}
我希望通过api更新成功后数据库中的数据会更新
// 在 Laravel 中使用带有后缀 ?_method=PUT 的 POST 进行 PUT