在我今天得到的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');
});

实际上,这段代码中没有错误,但intelephense一直显示错误,所以有办法解决这个问题吗?


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

如果您想手动配置它,这里是repo。这是为vscode和PhpStorm。

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

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


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

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


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

Laravel 5.1 PHP 5.6.40


你不需要降级,你可以:

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

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


1.3.1固定它。

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


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

安装laravel-ide-helper

编译器需要——dev barryvdh/ laravell -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;

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

版本的

幼虫 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

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


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

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

我还在接收信息

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

这似乎解决了问题。


下面是我解决的问题:

打开扩展设置:

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

你应该考虑的变量有:

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)索引工作区


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

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

For single workspace it is very simple, you have to create .php file with all signatures and intelephense will index them. If you want add stubs globally, you still can, but I'm not sure if it's intended feature. Even if intelephense.stubs throws warning about incorrect value you can in fact put there any folder name. { "intelephense.stubs": [ // ... "/path/to/your/stub" ] } Note: stubs are refreshed with this setting change. You can take a look at build-in stubs here: https://github.com/JetBrains/phpstorm-stubs

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

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

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

// ... and so on

对那些宁愿保持简单的人来说,愚蠢;如果你想摆脱通知,而不是安装帮助程序或降级,只需在设置中禁用错误。Json:

"intelephense.diagnostics.undefinedTypes": false

在我的例子中,由于某种原因,供应商文件夹在VS Code设置中被禁用:

    "intelephense.files.exclude": [
        "**/.git/**",
        "**/.svn/**",
        "**/.hg/**",
        "**/CVS/**",
        "**/.DS_Store/**",
        "**/node_modules/**",
        "**/bower_components/**",
        "**/vendor/**", <-- remove this line!
        "**/resources/views/**"
    ],

通过删除包含供应商文件夹的行,它可以在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。vcode - Intelephense -client并逐个禁用Intelephense›Diagnostics:您将看到错误显示将停止。


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

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

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

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

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

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


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


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

设置语言模式为Blade(使用扩展:Laravel Blade格式化器) 这将解决问题。否则,请按照此步骤操作。

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

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

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