Visual Studio代码PHP Intelephense保持显示不必要的错误

在我今天得到的PHP Intelephense的最新更新之后,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一直显示错误,所以有办法解决这个问题吗?

273498 次浏览

这实际上是一组用于编辑器理解Laravel的配置。

如果你想手动配置它,这里是回购。这是为vscode和PhpStorm。

或者如果你愿意,你可以下载这个。(我创建的)建议全局安装。

然后运行andylaravel setupIDE。这将根据第一个repo为您配置所有内容。

不,只有在自动更新Intelephense扩展后才会出现错误。

要解决这个问题,您可以通过单击Intelephense扩展中的“安装另一个版本”将其降级到以前的版本。版本1.2.3上没有错误。

版本1.3.0有缺陷IMO。
降级到1.2.3版本可以解决我的问题。

我在

  • Laravel 5.1
  • PHP 5.6.40

降级至1.2.3版本 .

你不需要降级,你可以:

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

或者使用ide助手为laravel外观添加存根。看到https://github.com/barryvdh/laravel-ide-helper

1.3.1固定它。

只要更新你的扩展,你应该是好的去

如果您知道您的问题仅限于Facades,并且您正在运行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

use Illuminate\Support\Facades\Route;

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

版本的

  • Larvel 6 +
  • Vscode版本1.40.2
  • PHP intelephense 1.3.1

Intelephense 1.3增加了未定义的类型、函数、常量、类常量、方法和属性诊断,而之前在1.2中只有未定义的变量诊断。

一些框架的编写方式为用户提供了方便的快捷方式,但使得静态分析引擎很难发现运行时可用的符号。

https://github.com/barryvdh/laravel-ide-helper这样的存根生成器有助于填补这里的空白,并将其与Laravel一起使用将通过提供易于发现的符号的具体定义来处理许多错误诊断。

不过,PHP是一种非常灵活的语言,根据代码的编写方式,可能会出现其他错误的未定义符号。因此,从1.3.3开始,intelephense有配置选项来启用/禁用每一类未定义符号,以适应工作空间和编码风格。

这些选项是: intelephense.diagnostics.undefinedTypes intelephense.diagnostics.undefinedFunctions intelephense.diagnostics.undefinedConstants intelephense.diagnostics.undefinedClassConstants intelephense.diagnostics.undefinedMethods intelephense.diagnostics.undefinedProperties intelephense.diagnostics.undefinedVariables < / p >

将除intelephense.diagnostics.undefinedVariables之外的所有这些设置为false将给出1.2版本的行为。查看VSCode设置界面并搜索intelephense

我也有同样的问题,下面的内容似乎已经解决了这个问题。

a)更新至最新版本1.3.5,并重新启用所有诊断设置。

我还在接收信息

b)将带有依赖库的vendor文件夹添加到工作区

这似乎解决了问题。

下面是我解决的问题:

打开扩展设置:

enter image description here

然后搜索你想要更改的变量,然后取消选中它

enter image description here

你应该考虑的变量有:

intelephense.diagnostics.undefinedTypes
intelephense.diagnostics.undefinedFunctions
intelephense.diagnostics.undefinedConstants
intelephense.diagnostics.undefinedClassConstants
intelephense.diagnostics.undefinedMethods
intelephense.diagnostics.undefinedProperties
intelephense.diagnostics.undefinedVariables

如果你在添加一个新的Vendor类后立即看到这个,一定要运行VScode命令(control-shift-P) Index Workspace

对于任何经历这些问题并对禁用一整套检查感到不安的人来说,有一种方法可以将您自己的自定义签名传递给Intelephense

复制自Intelephese repo的评论(由@KapitanOczywisty):
https://github.com/bmewburn/vscode-intelephense/issues/892#issuecomment-565852100 < / em > < / p >

对于单个工作空间来说非常简单,你必须创建.php文件 所有签名和intelephense将索引它们 如果你想全局添加存根,你仍然可以,但我不确定是否 它的意图是功能。即使intelephense.stubs抛出警告 你可以将任何文件夹的名称放在这里。

{
"intelephense.stubs": [
// ...
"/path/to/your/stub"
]
}

注意:存根刷新此设置更改。

你可以在这里查看内置存根: https://github.com/JetBrains/phpstorm-stubs < / p >

在我的情况下,我需要dspec的describebeforeEachit…不被突出显示为错误,所以我只是在我的VSCode的工作空间设置中包含了签名/directories_and_paths/app/vendor/bin/dspec的文件,其中有我需要的函数声明:

function describe($description = null, \Closure $closure = null) {
}


function it($description, \Closure $closure) {
}


// ... and so on

对那些宁愿保持简单的人来说,愚蠢;如果你想摆脱通知,而不是安装帮助器或降级,只需在settings.json中通过添加这个来禁用错误:

"intelephense.diagnostics.undefinedTypes": false

在我的例子中,由于某种原因,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版本上正常工作

 use Illuminate\Support\Facades\Route;

添加上面的名称空间

在你的web。php中

添加这行代码

use Illuminate\Support\Facades\Route;

然后你就完成了,如果你得到了认证错误,然后添加这行代码

use Illuminate\Support\Facades\Auth;

谢谢。

v1.7.1中有同样的问题。它在内置函数上显示错误。但刚刚找到解决方案:去扩展设置@ext:bmewburn.vscode-intelephense-client,并逐个禁用Intelephense;诊断:,你会看到错误显示将停止。

自版本1.7.1以来,有其他解决方案

现在你可以知道intelephense应该在哪里寻找依赖项,例如vendor是最常见的。

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

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

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

你可以阅读更多在这里的更新日志

我最近解决了我自己的问题。通过going file >首选项 我在寻找智慧 有文件要排除的部分,我注意到vendor文件夹被添加了。 我删除了它,现在我所有的laravel文件索引

我找到的唯一可行的解决方案是:

设置语言模式为Blade(使用扩展名:Laravel Blade格式化器) 这将解决问题。

. txt

. txt

. txt

这些类不存在于工作区中。Laravel在运行时创建它们。因此,它们被报告为未定义的。解决方案是提供存根定义

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

或关闭诊断(intelephense.diagnostics.undefinedTypes)。