Laravel用户模型未在JSON响应中处理

时间:2019-03-14 22:09:35

标签: json laravel response

我有一个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);
}

作为集合的index方法句柄可以很好地工作,但是使用模型的update方法返回空(根本没有内容)。我已确认$data变量确实包含了预期的模型信息,因为我可以打印显示所需结果的JSON编码。由于某种原因,它在response()->json()中不起作用。

1 个答案:

答案 0 :(得分:1)

其实际功能非常复杂。

在这里,您有问题,无需多言以作答,您需要返回。

    $user->save();

    $this->showOne($user);
}

应为:

    $user->save();

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

奖金:我将研究响应转换以供将来参考,请参见Eloquent ResourcesFractal。您可以使用FormRequest来验证输入,而无需执行过多的if逻辑。