You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel+JWT环境调用tasks()报null错误,模型关联问题求助

问题描述

已完成JWT、Laravel和Postman的配置,拥有users与tasks两张数据表,且为二者配置了hasMany与BelongsTo关联关系:

Task.php

public function user() {
    return $this->belongsTo(User::class);
}

User.php

public function tasks()
{
    return $this->hasMany(Task::class);
}

编写返回tasks列表的方法,TaskController.php代码如下:

public function index()
{
    $tasks = $this->user->tasks()->get(['title', 'description'])->toArray();

    return $tasks;
}

运行时触发错误:

Error: Call to a member function tasks() on null in file C:\wamp64\www\jwtestb\app\Http\Controllers\TaskController.php on line 30

错误原因与解决方案

错误原因

$this->user的值为null,说明控制器中没有正确获取到当前登录的用户实例。Laravel控制器默认不会自动将认证用户赋值到$this->user属性,必须通过正确方式获取。

解决方案

方案1:通过Auth facade获取当前用户

修改TaskController的index方法,先验证用户登录状态再获取任务:

use Illuminate\Support\Facades\Auth;

public function index()
{
    if (!Auth::check()) {
        return response()->json(['message' => '未登录'], 401);
    }
    
    $tasks = Auth::user()->tasks()->get(['title', 'description'])->toArray();

    return $tasks;
}

方案2:方法参数类型提示注入用户

在方法参数中直接声明User类型,Laravel会自动解析当前认证用户(需确保路由已应用auth:api中间件):

use App\Models\User;

public function index(User $user)
{
    $tasks = $user->tasks()->get(['title', 'description'])->toArray();

    return $tasks;
}

方案3:控制器构造方法中初始化用户属性

如果多个方法需要使用当前用户,可在构造方法中统一处理:

use Illuminate\Support\Facades\Auth;

protected $user;

public function __construct()
{
    $this->middleware('auth:api');
    $this->user = Auth::user();
}

public function index()
{
    $tasks = $this->user->tasks()->get(['title', 'description'])->toArray();

    return $tasks;
}

额外检查项

  • 确认路由已添加auth:api中间件,否则无法触发用户认证:
Route::get('/tasks', [TaskController::class, 'index'])->middleware('auth:api');
  • 检查Postman请求头是否正确携带JWT令牌,格式为Authorization: Bearer {你的令牌}。

内容的提问来源于stack exchange,提问作者marzouk najib

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:35:22