Пользовательская модель Laravel не обрабатывается в ответе JSON - PullRequest
1 голос
/ 15 марта 2019

У меня есть Laravel 5.8 API, где ответ 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().

1 Ответ

1 голос
/ 15 марта 2019

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

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

    $user->save();

    $this->showOne($user);
}

должно быть:

    $user->save();

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...