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

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

namespace App\Traits;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;

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') && $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().

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
188
1

Ответы 1

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

Вот вам и проблема, само собой для рендеринга ответа нужен возврат.

    $user->save();

    $this->showOne($user);
}

должно быть:

    $user->save();

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

Бонус: я хотел бы изучить преобразование ответа для будущих ссылок, см. Красноречивые ресурсы или фрактал. Вместо того, чтобы делать слишком много логики, вы можете использовать ФормаЗапрос для проверки ввода.

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

Paul 15.03.2019 07:03

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

mrhn 15.03.2019 11:00

Другие вопросы по теме