我们有一个 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\User
为Auth0\Login\User
,那么我会有一个Authenticatable
无法运行的类,hasPermissionTo()
我现在必须修复一堆代码。