Пользовательская модель Laravel не является процессом в ответе JSON

#json #laravel #response

#json #laravel #ответ

Вопрос:

У меня есть Laravel 5.8 API, где ответ JSON для коллекции пользователей работает должным образом, но не работает для модели.

 namespace AppTraits;

use IlluminateDatabaseEloquentModel;
use IlluminateSupportCollection;

trait ApiResponder
{
    private function successResponse($data, $code)
    {
        return response()->json($data, $code);
    }

    protected function errorResponse($message, $code)
    {
        return response()->json(['error' => $message, 'code' => $code], $code);
    }

    protected function showAll(Collection $collection, $code = 200)
    {
        return $this->successResponse(['data' => $collection], $code);
    }

    protected function showOne(Model $model, $code = 200)
    {
        return $this->successResponse(['data' => $model], $code);
    }
}
  

Ниже приведены методы контроллера, вызывающие ответ.

 public function index()
{
    $users = User::all();

    return $this->showAll($users);
}

public function update(Request $request, $id)
{
    $user = User::findOrFail($id);

    $rules = [
        'email' => 'email|unique:users,email,' . $user->id,
        'password' => 'min:6|confirmed'
    ];

    if ($request->has('name')) {
        $user->name = $request->name;
    }

    if ($request->has('email') amp;amp; $user->email != $request->email) {
        $user->verififed = User::UNVERIFIED_USER;
        $user->verififcation_token = User::generateVerificationCode();
        $user->email = $request->email;
    }

    if ($request->has('password')) {
        $user->password = bcrypt($request->password);
    }

    if (!$user->isDirty()) {
        return $this->errorResponse('You need to specify a change to update', 422);
    }

    $user->save();

    $this->showOne($user);
}
  

Индексный метод, обработанный как коллекция, работает отлично, но метод обновления, использующий модель, возвращает пустое содержимое (вообще без содержимого). Я подтвердил, что $data переменная действительно содержит информацию о модели, как и ожидалось, поскольку я могу напечатать кодировку JSON, которая отображает желаемый результат. По какой-то причине она просто не работает в response()->json() .

Ответ №1:

Очень сложный код для того, что он на самом деле делает.

Здесь у вас проблема, излишне говорить, что для отображения ответа вам нужен возврат.

     $user->save();

    $this->showOne($user);
}
  

должно быть:

     $user->save();

    return $this->showOne($user);
}
  

Бонус: я бы изучил преобразование ответа для будущих ссылок, см. Eloquent Resources или Fractal. Вместо того, чтобы выполнять слишком много логики if, вы можете использовать FormRequest для проверки входных данных.

Комментарии:

1. Спасибо за ваш ответ, расстраивает, когда это что-то простое. Я следовал руководству по udemy, чтобы настроить этот API и попытаться использовать лучшие ресурсы, но эй-хо. Спасибо за вашу помощь

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