Visual Studio Code PHP Intelephense继续显示不必要的错误

279

今天我收到了PHP Intelephense的最新更新后,它一直显示我的路由(和其他类)未定义符号的错误,之前没有出现过这样的错误,这让我很困扰。

这是错误截图:

enter image description here

这是我的代码:

Route::group(['prefix' => 'user', 'namespace' => 'Membership', 'name' => 'user.'], function () {
    Route::get('profile', 'ProfileController@show')->name('profile.show');
    Route::patch('profile', 'ProfileController@update')->name('profile.update');
    Route::patch('change-password', 'ChangePasswordController@change')->name('change-password');
    Route::get('role', 'ProfileController@getRole')->name('profile.role');
    Route::get('summary', 'SummaryController@show')->name('summary');
    Route::get('reserved', 'AuctionController@reservedAuction')->name('reserved');
});

实际上这段代码并没有错误,但 Intelephense 一直显示有错误,有什么方法可以解决吗?


我已经在应用程序的问题队列 - https://github.com/bmewburn/vscode-intelephense/issues/885 上报告了一个问题。 - anoopjohn
如果在您的 api.php 中的路由上出现未定义错误,请参见 @user12483351 的下面的答案。这对我有用。我使用的是 Intelephese 1.3.6。 - dotNET
23个回答

267
Intelephense 1.3增加了未定义类型、函数、常量、类常量、方法和属性诊断,而在1.2中仅有未定义变量诊断。一些框架以提供方便的快捷方式为用户编写,但这使得静态分析引擎难以发现运行时可用的符号。像https://github.com/barryvdh/laravel-ide-helper这样的存根生成器有助于填补这个空白,并且使用它与Laravel将通过提供可以轻松发现的符号的具体定义来处理许多虚假诊断。尽管如此,PHP是一种非常灵活的语言,根据代码编写方式,可能会有其他虚假未定义符号的实例。因此,自1.3.3以来,intelephense具有配置选项,以启用/禁用每个未定义符号类别,以适应工作区和编码风格。这些选项包括:intelephense.diagnostics.undefinedTypesintelephense.diagnostics.undefinedFunctionsintelephense.diagnostics.undefinedConstantsintelephense.diagnostics.undefinedClassConstantsintelephense.diagnostics.undefinedMethodsintelephense.diagnostics.undefinedPropertiesintelephense.diagnostics.undefinedVariables。将所有这些设置为false,除了intelephense.diagnostics.undefinedVariables,将获得版本1.2的行为。请参见VSCode设置UI并搜索intelephense

几天以来一直有烦人的警报,现在最新的1.3.3更新后一切都好了。感谢@bmewburn。 - Tariqul Islam
8
感谢提供单独的配置文件,我目前已禁用 undefinedMethods 功能,因为 intelephense 无法将 Laravel 的辅助函数 auth()->user() 识别为类 \App\User,所以从 auth()->user() 调用 \App\User 内部的方法会被视为错误。我只需在我的路由中添加 use Illuminate\Support\Facades\Route; 就可以修复未定义符号路由错误。 - Christhofer Natalius
8
谢谢。对于我的设置,只需禁用 intelephense.diagnostics.undefinedMethodsintelephense.diagnostics.undefinedType 即可。 - kamudrikah
laravel-ide-helper修复了警告。谢谢! - giovannipds
6
在 VsCode 中按 ctrl+,。搜索 undefined 并取消所有复选框中的勾,其中写着 Intellephense > Diagnostics - Hamza Waleed
显示剩余3条评论

172

我认为版本1.3.0存在缺陷。
降级到版本1.2.3可以解决我的问题。

我的环境:

  • Laravel 5.1
  • PHP 5.6.40

降级到版本1.2.3


3
加入"use Illuminate\Support\Facades\Route;"语句将解决问题。通常情况下,对于每一个未找到的符号,只需声明相应的门面即可。 - AlexWebLab
3
有其他问题。你会因查询作用域等问题而收到错误提示。这不仅仅是门面(facades)的问题。 - Miloslav Milo Janoušek
2
Intelephense 1.3.3 添加了更多的配置选项,以适应您的工作区和编码风格。现在可以启用/禁用每个未定义诊断类别以适应您的需求。 - bmewburn
在我看来,最好的解决方案是升级到最新版本1.3.11(截至目前),然后在您的设置文件中禁用未定义类型检查 "intelephense.diagnostics.undefinedTypes": false,。这样,您就不会失去新版本中实施的所有其他修复。 - Kalema Edgar
1
intelephense 1.4.0也存在引用"Controller"和"View"等单词的问题。我回滚到了1.3.11,现在它可以正常工作了。 - KD_Raj
太棒了,你帮了我。 - Carlos Maemo

71

如果您在添加新的供应商类之后立即看到这个提示,请确保运行VScode命令(control-shift-P)索引工作区


1
这似乎起作用了,但下一次我编辑并保存文件时它又出现了。 :-( - Circle B
4
刚刚在回答我的问题时发现了我自己的评论!我都忘记了这个…… - Snapey
这对我有用,因为Intellisense尚未发现我新安装的库。 在某些Mac上,它是“command-shift-p”。 有关命令调色板的更多信息,请参阅:https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette - Justin
这真的起作用了。我已经创建了项目并安装了软件包,但是直到我看到“索引工作区”时,VSCode才能识别它们。 - danish-khan-I
这对我来说很有效! - Abdüssamet Aslan
显示剩余2条评论

53
use Illuminate\Support\Facades\Route;

导入相应的命名空间后,警告消失了。

版本信息

  • Larvel 6+
  • vscode 版本 1.40.2
  • php intelephense 1.3.1

1
这实际上解决了问题。 对于 console.php 中的命令,也可以使用以下方式: use Illuminate\Support\Facades\Artisan; - AlexWebLab
1
这不是Laravel推荐的方式。laravel-ide-helper的配置是推荐的方式。 - giovannipds
2
添加这个解决了Route的问题,但是我在Auth上也遇到了同样的错误,所以我也添加了use Illuminate\Support\Facades\Auth;。问题解决了。 - Daydah
@Daydah 我也一样 - pkucas

39
在我的情况下,由于某些原因,vendor文件夹在VS Code设置中被禁用了。
    "intelephense.files.exclude": [
        "**/.git/**",
        "**/.svn/**",
        "**/.hg/**",
        "**/CVS/**",
        "**/.DS_Store/**",
        "**/node_modules/**",
        "**/bower_components/**",
        "**/vendor/**", <-- remove this line!
        "**/resources/views/**"
    ],

删除包含vendor文件夹的那一行,就可以在Intelephense 1.5.4版本上正常使用。


3
我还必须删除"**/vendor/**/{Tests,tests}/**",这一行;不知道那一行怎么会在那里。 - knb
3
我做了同样的事情,但仍然出现错误。 - Mohammad_Hosseini
1
@knb 这是默认设置的一部分。默认包含 **/vendor/**/vendor/****/vendor/**/{Tests,tests}/** - mbomb007
@mohammad_hosseini 在尝试单独打开脚本之前,请先尝试在VSCode中打开文件夹。 - Paulo Costa
我猜Intelephense默认包含这些文件夹,但我不确定为什么。从Intelephense › Files中删除供应商引用可以在不安装ide-helper的情况下为我固定类型提示。但请勿从Intelephense › References或Intelephense › Rename中删除它们。 - Rtzoor

30

如果您知道问题仅限于 Facedes 并且正在运行 Laravel 5.5 或更高版本,则此解决方案可能对您有用。

安装 laravel-ide-helper

composer require --dev barryvdh/laravel-ide-helper

在您的AppServiceProvider中添加此条件语句以注册 helper 类。

public function register()
{
    if ($this->app->environment() !== 'production') {
        $this->app->register(\Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class);
    }
    // ...
}

然后运行php artisan ide-helper:generate生成一个文件,以帮助IDE理解Facades。您需要重新启动Visual Studio Code。

参考资料

https://laracasts.com/series/how-to-be-awesome-in-phpstorm/episodes/16

https://github.com/barryvdh/laravel-ide-helper


2
这个问题在于你会得到重复的定义。 - Carlos Mora
intelephense重启VS Code后停止了对“Auth”的高亮显示。我完全按照这个答案中所示的步骤来做了。重新启动VS Code后,请等待一两分钟,错误应该会消失。 - agm1984

26

您不需要降级,可以选择:

要么在设置中禁用未定义符号诊断 -- "intelephense.diagnostics.undefinedSymbols": false。

要么使用添加了 Laravel Facades 存根的 IDE 辅助程序。请参见 https://github.com/barryvdh/laravel-ide-helper


3
IDE Helper可以解决Route闭包或其他闭包的问题,但在使用Eloquent作用域时可能会遇到其他错误。 - Miloslav Milo Janoušek
11
为了解决一个问题,我们需要进行准确的诊断。绝不能妥协! - Carlos Mora
1
我安装了IDE Helper并按照说明生成了文件。这是在Laravel项目上进行的。它似乎没有改变任何东西,仍然到处都是未定义的符号。所以我降级到1.2.3。 - vesperknight
1
谢谢您的建议 - 现在似乎有一个更简单的选项 - 如果您点击设置的齿轮并滚动到intelliphense的扩展设置中,那里有各种复选框,其中一个是未定义类型。我在我的代码中遇到了许多未定义类型的错误,因为我正在开发一个Joomla模板,而我认为intelliphense无法看到各种Joomla类,如JRequest、JFactory等...一个非常有用的补充是告诉它仅忽略与某个模式匹配的未定义类型(例如在Joomla中以字母J开头)。 - TheKLF99

21
在我的情况下,我不得不强制 Intelephense 对工作区进行索引。以下是我在 VsCode 中的操作步骤: ctrl + shift + p > Intelephense: Index workspace

天啊!这个方法可行!虽然需要一个文件一个文件地运行,但它已经解决了我的问题! - Jeremy
这真的让我开心起来。谢谢你!!! - undefined

17

从1.7.1版本(2021年5月2日)开始,有另一种解决方案。

现在你可以告诉intelephense应该在哪里查找依赖项,比如vendor是最常见的地方。

"intelephense.environment.includePaths": [
    "vendor"
],

此外,它甚至绕过了VSCode规则。

"files.exclude": {
    "**/vendor": true
},

您可以在此处查看更新日志


1
你去哪里编辑这个? - Grant
3
您可以将这些规则添加到settings.json文件中。按F1并查找“打开用户设置(JSON)”。 - Quentium
感谢 @QuentiumYT - $HOME/Library/Application Support/Code/User/settings.json - Grant
这对我有用,在尝试了所有上面的建议都没有成功之后。谢谢@QuentiumYT - Stu
在VS Code设置中包含vendor目录是秘密的关键,谢谢! - Justin Hammond

16

1.3.1已修复。

只需更新您的扩展程序,就可以顺利运行。


我也是,有修复方法吗?还是我们需要降级? - tonix
5
对我来说,这并没有解决任何问题。回到1.2.3版本很好! - Carlos Mora
1
1.3.1 对我来说仍存在这个问题。1.2.3 已经修复了它。 - NULL pointer
3
我在使用版本1.3.2,问题仍未得到解决。我重新降级到了1.2.3版本。 - AlexWebLab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接