首页 > 解决方案 > 解决 Laravel Auth Authenticatable to User 模型解决静态分析问题

问题描述

我们有一个 Laravel 8 应用程序。

我们使用标准的 LaravelAuth外观来检索经过身份验证的用户

我们的User模型有一些自定义函数,其中最重要的是速记函数,hasPermissionTo(). (原因是因为我们有一个非常自定义的 RBAC 设置。)

所以在我们的很多控制器中,我们都有这样的东西......

use Illuminate\Routing\Controller as BaseController;

class ExampleController extends BaseController
{

  public function index()
  {
    if (\Auth::user()->hasPermissionTo('Management:View Users')) {
      // do something.
    }
    // etc.
  }
}

在我们开始运行静态分析之前,一切都很好。我们正在使用 Larastan,这给了我这些错误:

------ -------------------------------------------------------------------------------------------
 Line   Http/Controllers/ExampleController.php
------ -------------------------------------------------------------------------------------------
  48     Call to an undefined method Illuminate\Contracts\Auth\Authenticatable::hasPermissionTo().

这也是有道理的,因为Auth门面代理Illuminate\Auth\AuthManager,并且Auth::user()通过__call()魔法,通常会解析为Illuminate\Auth\SessionGuard::user()并且类型提示这个......

    /**
     * Get the currently authenticated user.
     *
     * @return \Illuminate\Contracts\Auth\Authenticatable|null
     */
    public function user()
    {
    ...

所以最后,我的问题:

这里的失败在哪里?我是否需要 a) 更好地配置我的静态分析工具,b) 更好地配置 Laravel 以更准确地返回特定类型,或者 c) 我是否需要在if (Auth::user() instanceof User) { ... }整个代码中添加显式子句?

是否有一种正确的方法可以用我自己的更具体的一个来覆盖 Laravel 股票类之一以解决更具体的功能?有没有办法将实际经过身份验证的用户类型提示到函数声明中,以便我可以声明function index(User $authenticatedUser)并让 Laravel 使用更具体的类型提示自动填充它?

我知道我可以在 Larastan 中为这个特定问题添加一个排除项并继续我的生活,但该错误旨在防止特定类别的错误 - 即,如果我添加 Auth0 并替换App\Model\UserAuth0\Login\User,那么我会有一个Authenticatable无法运行的类,hasPermissionTo()我现在必须修复一堆代码。

标签: phplaravelauthenticationstatic-analysisphpstan

解决方案


推荐阅读