Обновление функции Laravel 10.48.22 не обновляет данные в базе данных

Вопрос или проблема

Я только учусь создавать REST API с использованием Laravel. У меня есть таблица пользователей, модель пользователя и контроллер аутентификации. 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
{
    // Регистрация нового пользователя
    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);
        }

        // Обработка загрузки изображения
        $imagePath = null;
        if ($request->hasFile('image')) {
            $imagePath = $request->file('image')->store('images', 'public');
        }

        // Обработка данных о местоположении
        $location = null;
        if ($request->filled('latitude') && $request->filled('longitude')) {
            $longitude = $request->input('longitude');
            $latitude = $request->input('latitude');
            $location = new Point($longitude, $latitude);
        }

        // Создание пользователя
        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password),
            'role' => $request->role,
            'image' => $imagePath,
            'address' => $request->address,
            'location' => $location,
        ]);

        // Генерация JWT токена для нового пользователя
        $token = Auth::login($user);

        return response()->json([
            'message' => 'Пользователь успешно зарегистрирован',
            'user' => $user,
            'token' => $token,
        ], 201);
    }

    // Вход пользователя
    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' => 'Неверные учетные данные'], 401);
        }

        return response()->json([
            'token' => $token,
        ]);
    }

    // Выход пользователя
    public function logout()
    {
        Auth::logout();
        return response()->json(['message' => 'Вы успешно вышли']);
    }

    // Обновление профиля пользователя
    public function update(Request $request, $id)
    {
        $user = User::findOrFail($id);

        // Проверка, имеет ли аутентифицированный пользователь право обновлять этого пользователя
        if (Auth::user()->role !== 'admin' && Auth::id() !== $user->id) {
            return response()->json(['message' => 'Нет доступа'], 403);
        }

        // Проверка данных запроса
        $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);
        }

        // Обновление полей пользователя
        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');
        }

        // Обработка данных о местоположении
        if ($request->filled('latitude') && $request->filled('longitude')) {
            $longitude = $request->input('longitude');
            $latitude = $request->input('latitude');
            $user->location = new Point($longitude, $latitude);
        }

        // Сохранение обновленных данных пользователя
        $user->save();

        return response()->json([
            'message' => 'Пользователь успешно обновлен',
            'user' => $user,
        ], 200);
    }

    // Получение данных пользователя
    public function detail($id)
    {
        $user = User::findOrFail($id);

        // Проверка, имеет ли аутентифицированный пользователь право видеть детали этого пользователя
        if (Auth::user()->role !== 'admin' && Auth::id() !== $user->id) {
            return response()->json(['message' => 'Нет доступа'], 403);
        }

        return response()->json($user);
    }

    // Поиск пользователей
    public function search(Request $request)
    {
        // Проверка поискового запроса
        $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);
        }

        // Получение поискового запроса и роли из запроса
        $query = $request->input('query');
        $role = $request->input('role');

        // Начало построения запроса
        $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.

// PUT в Laravel с использованием POST с суффиксом ?_method=PUT

Ответ или решение

Проблема, с которой вы столкнулись, может быть вызвана несколькими причинами. Давайте рассмотрим возможные проблемы и решения, чтобы убедиться, что функция обновления пользователя (update) правильно обновляет данные в базе данных в Laravel 10.48.22.

Возможные причины и их решения:

  1. Метод HTTP:
    Убедитесь, что вы используете правильный HTTP-метод при отправке запроса на обновление. Для обновления данных в REST API обычно используется метод PUT или PATCH. Если вы делаете запрос с помощью POST, убедитесь, что добавили параметр ?_method=PUT в URL.

    Пример запроса с помощью curl:

    curl -X PUT http://your-api-url/api/users/{id}?_method=PUT -d "name=NewName&email=newemail@example.com"
  2. Автентификация и авторизация:
    Убедитесь, что пользователь, который выполняет запрос на обновление, имеет соответствующие права доступа. В вашем коде вы проверяете роль пользователя:

    if (Auth::user()->role !== 'admin' && Auth::id() !== $user->id) {
       return response()->json(['message' => 'Unauthorized'], 403);
    }

    Убедитесь, что текущий аутентифицированный пользователь действительно является администратором или тем, кого он пытается обновить.

  3. Отправка данных:
    Проверьте, что данные, отправляемые в запросе, соответствуют полям, которые вы хотите обновить. Например, для обновления имени не забудьте включить его в тело запроса. Если вы используете JSON, структура данных может выглядеть так:

    {
       "name": "НоваяИмя",
       "email": "новыйemail@example.com"
    }
  4. Сохранение данных:
    Убедитесь, что вызов метода $user->save() действительно происходит. Если возникла ошибка при сохранении данных, проверьте, не возвращает ли он ложное значение из-за возможных ограничений базы данных или проблем с валидацией. Используйте dd($user->getErrors());, чтобы отладить возможные ошибки после вызова $user->save().

  5. Логика валидации:
    Если данные не соответствуют правилам валидации, они не будут обновлены. Проверьте логические условия и содержимое $request перед обновлением:

    if ($validator->fails()) {
       return response()->json(['errors' => $validator->errors()], 422);
    }
  6. Вывод в лог:
    Если все вышеперечисленное не помогает, добавьте логиирование, чтобы понять, что происходит в методе обновления. Используйте Log для отслеживания состояния данных:

    use Illuminate\Support\Facades\Log;
    
    Log::info('Updating user', ['user_id' => $user->id, 'request_data' => $request->all()]);

Заключение

После проверки всех этих моментов вы должны увидеть, что данные пользователя обновляются корректно в базе данных. Если проблема сохраняется, попробуйте проверить логи сервера на наличие ошибок или исключений, которые могли произойти во время выполнения запроса.

Если у вас остались дополнительные вопросы или нужна помощь в других аспектах Laravel, не стесняйтесь задавать их.

Оцените материал
Добавить комментарий

Капча загружается...