Laravel中的这段代码,我想使用它作为API, for each 访问我应用程序的人显示它.我想在他登录时获取用户ID

public function show($displayType)
{
    try {
        $data = houses::where('displayType', $displayType)->paginate(5);

        $user = auth()->user(); // Get the authenticated user

        $userId = $user ? $user->id : null; // Check if user is authenticated and get the user ID

        return response()->json([
            'status' => true,
            'message' => 'You have successfully retrieved data',
            'data' => $data,
            'user_id' => $userId, // Include the user ID in the response
        ]);
    } catch (\Throwable $th) {
        return response()->json([
            'status' => false,
            'message' => $th->getMessage(),
        ], 500);
    }
}

我想判断访问我网站的人是否已登录

但问题是当我发送令牌时返回用户id为空 这就是使用我的路由请求的方式. //这是我的路由,我在中间件判断中使用它

Route::get('houses/{displayType}',[housesController::class, 'show']);

Route::middleware('auth:api')->group(function () {})

推荐答案

默认使用

使用check()功能验证用户是否已登录.

if (auth()->check()) {
  // User is logged in
  $user = auth()->user();
} else {
  // User is not logged in
}

在Blade中,指令还可用于简化这些功能的调用.

@auth
  // The data only available for auth user
@endauth

// and

@guest
  // Show content if unauthenticated
@endguest

我们可以显式指定只有登录用户才能访问路由.

Route::get('houses/{displayType}', [HousesController::class, 'show'])
  ->middleware('auth'); // use middleware() function to add extra middleware to route

// or can use with group() function to can add extra middleware to more route

Route::middleware('auth')->group(function () {
  Route::get('houses/{displayType}', [HousesController::class, 'show']);
})

使用另一个Auth Guard的额外配置

Laravel默认应用web个基于会话的身份验证.如果您想偏离这一点,您需要通过设置与Laravel进行正确沟通.如果您想使用基于令牌的API身份验证进行默认登录,则需要根据文档在config/auth.php中适当修改defaults.guard值.

return [
  'defaults' => [
    'guard' => 'api', // here
  ],
  'guards' => [
    // default guard
    'web' => [
      'driver' => 'session',
      'provider' => 'users',
    ],

    // can use this
    'api' => [
       'driver' => 'token',
       'provider' => 'users',
       'hash' => true,
    ],
  ],
];

如果您不想修改此值,则可以 Select 使用guard()函数在每个请求中重写此值.

if (auth()->guard('api')->check()) {
  // User is logged in
  $user = auth()->guard('api')->user();
} else {
  // User is not logged in
}

Laravel相关问答推荐

如何使用PHP版本8.2.6安装beyondcode/laravel-websockets软件包?

如何从@foreach 循环中捕获所有数据并将其传递给 值? - Laravel

阻止用户查看其他用户正在查看的内容的最佳方法是什么?

将数据从控制器传递到 Laravel 中的视图

Laravel Livewire 组件在刷新后不会自动刷新/重新加载

laravel Eloquent 模型更新事件未触发

如何在 vue 模板中引用 laravel csrf 字段

Laravel - 将变量从中间件传递到控制器/路由

在 laravel 如何将额外的数据传递给 mutators 和 accessors

为什么人们将 .env 放入 gitignore?

artisan 迁移错误找不到类'Doctrine\\DBAL\\Driver\\PDOMySql\\Driver'

Laravel 监听器监听多个事件

从 sqlite DB 登录 Laravel,得到PDOException 找不到驱动程序

删除表后如何重新迁移laravel迁移

如何从 laravel 中的现有数据库创建迁移

当表中不存在列时如何将 paginate() 与 having() 子句一起使用

如何判断是否在laravel中使用了分页

Laravel binding绑定的用途和目的是什么?

Eloquent的关系 - attach附加(但不保存)到 Has Many

限制自己重载外部 API 的速率