返回

模型的 `boot` 方法中获取认证用户:全面指南与疑难解答

php

在模型的 boot 方法中获取认证用户:疑难解答

问题陈述

在模型的 boot 方法中调用 auth()->user() 时遇到问题,返回 null。本文旨在深入探讨问题并提供切实可行的解决方案,让你能够成功获取认证用户信息。

理解问题

问题根源:

  • 用户未登录。
  • 模型未与控制器关联,因此无法访问认证用户信息。

解决方法

确保用户已登录:

auth()->user() 仅在用户已登录时才有效。在 boot 方法执行前,请确保用户已通过身份验证。

将模型与控制器关联:

通常通过依赖注入将模型与控制器关联。这将使模型能够访问请求中包含的认证用户信息。

代码示例

控制器:

public function store(Request $request)
{
    $user = auth()->user();

    // 创建模型并保存数据
    $model = new Model();
    $model->created_by = $user->id;
    $model->save();
}

模型:

class Model extends Eloquent
{
    // 与控制器的关联
    public function creator()
    {
        return $this->belongsTo(User::class, 'created_by');
    }

    protected static function boot()
    {
        parent::boot();
        static::creating(function ($model) {
            if (auth()->check()) {
                $model->created_by = auth()->user()->id;
            }
        });

        static::updating(function ($model) {
            if (auth()->check()) {
                $model->updated_by = auth()->user()->id;
            }
        });
    }
}

结论

通过遵循这些步骤,你应该能够在模型的 boot 方法中成功获取认证用户。记住,确保用户已登录并与控制器建立关联至关重要。

常见问题解答

  1. 为什么我在模型的 boot 方法中获取认证用户?

    • 为了自动设置创建者和更新者信息。
  2. 用户未登录时如何处理?

    • 可以设置一个默认用户或抛出异常。
  3. 是否可以在其他地方访问认证用户信息?

    • 认证用户信息可以通过 Auth 门面在任何地方访问。
  4. 我可以使用模型查询来获取认证用户吗?

    • 是的,可以使用 withTrashed()onlyTrashed() 范围查询来获取所有用户,包括被软删除的用户。
  5. 是否可以使用中介件来确保认证?

    • 是的,可以使用中介件来检查用户是否已登录并重定向到登录页面。