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


142

在我获得了PHP Intelephense的最新更新之后,intelephense继续显示我的路线(以及其他类)的未定义符号错误,以前没有这样的错误,这困扰着我。

这是错误屏幕截图:

在此处输入图片说明

这是我的代码:

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');
});

这段代码中实际上没有错误,但是智能手机不断显示错误,因此有办法解决吗?


我在应用程序的问题队列中报告了一个问题-github.com/bmewburn/vscode-intelephense/issues/885
anoopjohn

如果您在的Route中遇到未定义的错误api.php,请参见下面的@ user12483351的答案。这为我解决了。我使用的是Intelephese 1.3.6。
dotNET

Answers:


103

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

将所有这些都设置为false,intelephense.diagnostics.undefinedVariables将获得1.2版的行为。请参阅VSCode设置UI并搜索intelephense


经过了几天令人讨厌的警报,现在有了最新的更新1.3.3-没关系。.感谢@bmewburn
Tariqul Islam

1
感谢单独的配置,现在我禁用了undefinedMethods,因为intelephense无法将laravel helper检测auth()->user()为类\ App \ User,因此从\ App \ User内部调用方法auth()->user()将被检测为错误。我只是添加use Illuminate\Support\Facades\Route;了我的路线,以修复未定义的符号路线错误。
Christhofer Natalius

2
谢谢你 对于我的设置,只是魔鬼intelephense.diagnostics.undefinedMethodsintelephense.diagnostics.undefinedType作品。
kamudrikah

laravel-ide-helper修复了警告。谢谢!
giovannipds

只需生成_ide_helper.php文档上建议的即可。
giovannipds

121

1.3.0版具有IMO缺陷。
降级到1.2.3版解决了我的问题。

我上线了

  • Laravel 5.1
  • PHP 5.6.40

降级至版本1.2.3


3
是的,我认为这是最好的答案,问题是新版本
Adrian Edy Pratama

是! 我遇到了完全相同的问题,一个小时前就开始了,因为Intelephense已更新为1.3.0-降级为1.2.3可以解决此问题。
leo

1
我也是。我正在使用PHP 5.3.3开发一个项目。一旦安装1.3,到处都会出现错误。在Intelephense扩展设置(“ intelephense.environment.phpVersion”:“ 5.3.3”)中将PHP版本设置为5.3.3并没有做任何事情。恢复为1.2.3修复。

2
@Alex还有其他问题。您将获得查询范围等错误。这不仅是外观。
米洛斯拉夫·米洛·贾努谢克(MiloJanoušek),

2
Intelephense 1.3.3添加了更多配置选项,以适合您的工作空间和编码样式。现在可以根据需要启用/禁用各种未定义诊断。
bmewburn

19

您无需降级,您可以:

在设置中禁用未定义​​的符号诊断-“ intelephense.diagnostics.undefinedSymbols”:false。

或使用为laravel外墙添加存根的ide帮助程序。参见https://github.com/barryvdh/laravel-ide-helper


3
IDE助手确实解决了Route件或其它封闭的问题,但你会在其他错误运行,而使用雄辩范围等
米洛斯拉夫·米洛Janoušek

3
因此,要解决一个问题,我们需要放弃真正的诊断。姐姐
卡洛斯·莫拉

我安装了IDE Helper并按照说明生成了文件。.这是在Laravel项目上。它似乎什么都没改变,但到处仍然有未定义的符号。所以我降级到1.2.3
vesperknight,

15
use Illuminate\Support\Facades\Route;

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

版本的

  • 幼虫6+
  • vscode版本1.40.2
  • PHP的智能1.3.1

这实际上解决了问题。对于console.php中的命令,它也可以很好地与以下命令配合使用:使用Illuminate \ Support \ Facades \ Artisan;
亚历克斯

不推荐使用laravel。laravel-ide-helper配置是。
giovannipds

将此添加解决了的问题Route,但是对于却遇到了相同的错误Auth,因此我也添加use Illuminate\Support\Facades\Auth;了。问题解决了。
Daydah

13

1.3.1修复了它。

只需更新您的扩展程序,您就应该做好了


22
我已经在v1.3.1上了,但错误不断出现。
ultrasamad

我也是,是否有修复程序或我们应该降级?
tonix

3
对我来说,它什么也解决不了。回到1.2.3很好!
卡洛斯·莫拉

1
1.3.1对我来说仍然有这个问题。1.2.3解决了它
NULL指针

2
我在1.3.2上,但仍未修复。重新降级至1.2.3。
亚历克斯

12

如果您知道问题仅限于Facades并且运行的是Laravel 5.5或更高版本,则此解决方案可能会对您有所帮助。

安装laravel-ide-helper

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

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

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


1
与此相关的问题是您得到了重复的定义
Carlos Mora

@CarlosMora在我看来似乎不是。我没有明白你的意思……
giovannipds

我正在使用laravel 6.x,它可以工作。
hakiko

laravel 7也可以工作
alfian5229

Auth重新启动VS Code后,intelephense停止突出显示。我完全按照此答案中显示的步骤进行操作。重新启动VS Code后,请等待一两分钟,然后应清除错误。
agm1984

6

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

如果您想手动配置所有这些,这里是repo。这适用于VS代码和PhpStorm。

或者,如果您愿意,可以下载此软件包。(我创建)建议您全局安装。

然后运行andylaravel setupIDE。这将根据拳头仓库为您配置所有内容。


5

不会,仅在自动更新Intelephense扩展后才会发生错误。

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


1
降级到1.2.3解决了该问题。
Julitillo

2

如果在添加新的Vendor类后立即看到此消息,请确保运行VScode命令(control-shift-P) Index Workspace


1

这是我解决的:

打开扩展名设置:

在此处输入图片说明

并搜索您要更改的变量,然后取消选中/选中它

在此处输入图片说明

您应该考虑的变量是:

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

1

对于那些人,宁愿保持简单,愚蠢;如果您希望摆脱通知,而不是安装帮助程序或降级,只需settings.json添加以下内容即可禁用您的错误:

"intelephense.diagnostics.undefinedTypes": false


0

我遇到了同样的问题,以下问题似乎已经解决了。

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

我仍然收到消息

b)将带有相关库的供应商文件夹添加到工作区

这似乎已经解决了问题。


您可以使用laravel-ide-helper
giovannipds

谢谢你的提示。我在Drupal内部使用Symfony。laravel-ide-helper会帮助您吗?
anoopjohn

0

对于遇到这些问题并且对禁用一整套检查感到不安的任何人,都有一种方法可以将您自己的自定义签名传递给Intelephense(我使用VSCode,但它对于Visual Studio Code应该也可以使用)。

摘自Intelephese回购评论(@KapitanOczywisty):https :
//github.com/bmewburn/vscode-intelephense/issues/892#issuecomment-565852100

对于单个工作空间,这非常简单,您必须创建.php具有所有签名的文件,并且智能手机将为其编制索引。

如果您想在全球范围内添加存根,则仍然可以,但是我不确定它是否是预期功能。即使intelephense.stubs抛出错误值警告,您实际上也可以在其中放置任何文件夹名称。

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

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

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

就我而言,我需要dspec的describebeforeEachit...要不要被高亮为错误,所以我就包含在签名文件/directories_and_paths/app/vendor/bin/dspec在我VSCode的工作区设置,其中有函数声明,我需要:

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

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

// ... and so on
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.