为什么不是';Laravel中间件中的intelephense是否从我的用户模型中识别功能?

为什么不是';Laravel中间件中的intelephense是否从我的用户模型中识别功能?,laravel,middleware,Laravel,Middleware,我制作了一个中间件,负责检查用户的权限。我在我的用户模型中实现了hasPermission函数。但是当我试图通过auth()->user使用它时,我得到了以下错误,为什么会发生这种情况 我在我的用户模型中实现了这个方法 public function hasPermission($permission) { return in_array($this->permissions(), $permission); } 这就是中间件 <?php namespace App\H

我制作了一个中间件,负责检查用户的权限。我在我的用户模型中实现了hasPermission函数。但是当我试图通过
auth()->user使用它时,我得到了以下错误,为什么会发生这种情况

我在我的用户模型中实现了这个方法

public function hasPermission($permission)
{
    return in_array($this->permissions(), $permission);
}
这就是中间件

<?php

namespace App\Http\Middleware;

use Closure;

class VerifyPermission
{
    public function handle($request, Closure $next, $permission)
    {
        if (auth()->check() && auth()->user()->hasPermission($permission)) {
            return $next($request);
        }
        abort(401, 'Unauthorized');
    }
}

这是因为
user()
方法的返回类型为
\illumb\Contracts\Auth\Authenticatable | null
,这是用户类实现的接口。这是因为它可能会根据您使用的防护返回不同的模型,但它们都必须实现
authenticable

我不知道有什么简单的方法可以全局更改,但您可以将用户保存在变量中并添加phpDoc块:

/** @var \App\User */
$user = auth()->user();

这应该由intelephense学习并显示正确的方法。

您的意思是“intelephense”不识别它。在实际运行这段代码时,你有没有遇到任何错误?是的,这段代码工作正常,但看起来不是很整洁。但我想这不是我的问题,我同意。但是,由于问题是注释而不是PHP类型提示,您可以通过重写容器中的
\illumb\Auth\SessionGuard
并将其替换为一个继承它的类,该类在phpDoc块中具有自己的
user()
方法和更精确的类型(没有其他内容)。但如果Laravel向该方法添加PHP类型的提示,它可能会破坏一些东西。