【问题标题】:Visual Studio Code PHP Intelephense Keep Showing Not Necessary ErrorVisual Studio Code PHP Intelephense 不断显示不必要的错误
【发布时间】:2020-03-27 17:06:21
【问题描述】:

在我今天获得 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 一直显示错误,有没有办法解决这个问题?

【问题讨论】:

  • 我在应用程序的问题队列中报告了一个问题 - github.com/bmewburn/vscode-intelephense/issues/885
  • 如果您在 api.php 的 Route 上遇到未定义的错误,请参阅下面的 @user12483351 的答案。那为我修好了。我在 Intelephese 1.3.6 上。

标签: php laravel visual-studio-code


【解决方案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

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

【讨论】:

  • 过去几天烦人的警报,现在有了最近的更新 1.3.3 - 一切正常......谢谢@bmewburn
  • 感谢单独的配置,现在我禁用了 undefinedMethods,因为 intelephense 无法检测 laravel helper auth()->user() 作为类 \App\User 因此将检测到来自 auth()->user() 的 \App\User 内的调用方法作为错误。我刚刚在路由中添加了use Illuminate\Support\Facades\Route; 来修复未定义符号路由错误。
  • 谢谢。对于我的设置,只需禁用 intelephense.diagnostics.undefinedMethodsintelephense.diagnostics.undefinedType 即可。
  • laravel-ide-helper 修复了警告。谢谢!
  • 在 VsCode 中按 ctrl+,。搜索undefined 并取消选中显示Intellephense > Diagnostics的所有复选框
【解决方案2】:

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

我来了

  • Laravel 5.1
  • PHP 5.6.40

【讨论】:

  • 添加“使用 Illuminate\Support\Facades\Route;”实际上会解决问题。作为一般规则,对于每个未找到的符号,只需声明适当的 Facade。
  • @Alex 还有其他问题。你会得到查询范围等的错误。这不仅仅是门面。
  • Intelephense 1.3.3 添加了更多配置选项以适应您的工作空间和编码风格。现在可以启用/禁用每个类别的未定义诊断以适合。
  • 在我看来,最好的解决方案是升级到最新版本 1.3.11(截至目前),然后在设置文件 "intelephense.diagnostics.undefinedTypes": false, 中禁用未定义​​类型检查。这样,您就不会丢失新版本中实施的所有其他修复。
  • intelephense 1.4.0 还存在引用“Controller”和“View”等词的问题。我回滚到 1.3.11,它工作正常。
【解决方案3】:
use Illuminate\Support\Facades\Route;

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

版本的

  • 幼虫 6+
  • vscode 版本 1.40.2
  • php intelephense 1.3.1

【讨论】:

  • 这实际上解决了问题。对于 console.php 中的命令,它也适用于:use Illuminate\Support\Facades\Artisan;
  • 这不是 laravel 推荐的。 laravel-ide-helper配置是。
  • 添加这个解决了Route 的问题,但我对Auth 有同样的错误,所以我也添加了use Illuminate\Support\Facades\Auth;。问题解决了。
  • @Daydah 和我一样
【解决方案4】:

您无需降级即可:

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

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

【讨论】:

  • IDE Helper 确实解决了 Route 闭包或其他闭包的问题,​​但是您在使用 eloquent scope 等时会遇到其他错误。
  • 所以要解决问题,我们需要放弃真正的诊断。不可能,城西!
  • 我安装了 IDE Helper 并按照说明生成了文件。这是在 Laravel 项目中。它似乎什么都没有改变,仍然到处都是未定义的符号。所以我降级到 1.2.3
  • 感谢您的建议 - 现在似乎有一个更简单的选项 - 如果您单击 cog 进行设置并滚动浏览 intelliphense 的扩展设置,则会出现各种复选框,其中一个用于未定义类型.当我在处理 joomla 模板时,我的代码中有很多未定义类型的错误,我认为 intelliphense 看不到各种 Joomla 类,如 JRequest、JFactory 等……一个非常有用的补充是告诉它只忽略匹配特定模式的未定义类型(比如在 Joomla 中以字母 J 开头)
【解决方案5】:

如果您知道您的问题仅限于 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

【讨论】:

  • 问题是你得到重复的定义
  • intelephense 在我重新启动 VS Code 后停止突出显示 Auth。我完全按照此答案中显示的步骤进行了操作。重新启动 VS Code 后,等待一两分钟,错误就会消失。
【解决方案6】:

就我而言,出于某种原因,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 版本上运行正常

【讨论】:

  • 我还必须删除 "**/vendor/**/{Tests,tests}/**", ;不知道那条线是怎么进去的。
  • 我做了同样的事情,但我仍然收到错误
【解决方案7】:

如果您在添加新的 Vendor 类后立即看到此内容,请务必运行 VScode 命令 (control-shift-P) Index Workspace

【讨论】:

  • 这似乎有效,但下次我编辑并保存我的文件时它又出现了。 :-(
  • 刚刚找到我自己的评论来回答我的问题!我忘记了这个..
【解决方案8】:

1.3.1 修复了它。

只需更新您的扩展程序就可以了

【讨论】:

  • 我也是,有解决办法还是应该降级?
  • 对我来说,它不能解决任何问题。回到 1.2.3 就好了!
  • 1.3.1 对我来说仍然存在这个问题。 1.2.3 修复了
  • 我在 1.3.2 上,但仍未修复。重新降级到 1.2.3。
【解决方案9】:

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

"intelephense.diagnostics.undefinedTypes": false

【讨论】:

  • 是否有“程序”来为给定的错误消息找到适当的“诊断”?比如说,我有一个遗留项目,并且有很多消息,比如“非静态方法 'builder' 不应该被称为 statically.intelephense(1036)”。哪个选项应该禁用这些消息?
【解决方案10】:

我解决了:

打开扩展设置:

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

你应该考虑的变量是:

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

【讨论】:

  • 尝试此解决方案后,我重置了“索引工作区”,谢谢...
  • 在 intelephense 1.5.4 版上不起作用,有什么修复吗?
  • 谢谢!就我而言,我尝试了laravel-ide-helper,我刚刚停用了intelephense.diagnostics.undefinedMethods,因为我的livewire 组件快疯了
【解决方案11】:

这确实是你的编辑器理解 Laravel 的一套配置。

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

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

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

【讨论】:

    【解决方案12】:

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

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

    【讨论】:

      【解决方案13】:

      从1.7.1版本(2021-05-02)开始还有其他解决方案

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

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

      而且,它甚至绕过了 VSCode 规则

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

      您可以阅读更多in the changelog here

      【讨论】:

      • 你去哪里编辑这个?
      • 您可以在 settings.json 文件中添加这些规则。按 F1 并查找“打开用户设置 (JSON)”
      • 感谢@QuentiumYT - $HOME/Library/Application Support/Code/User/settings.json
      • 在尝试了上述所有建议但没有成功后,这对我有用。谢谢@QuentiumYT
      【解决方案14】:

      v1.7.1 中遇到了同样的问题。它在内置函数上显示错误。但是刚刚找到了解决方法:进入扩展设置@ext:bmewburn.vscode-intelephense-client并一一禁用Intelephense›Diagnostics:,您将看到错误显示将停止。

      【讨论】:

        【解决方案15】:

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

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

        对于单个工作区非常简单,您必须创建.php 文件 带有所有签名和 intelephense 将对它们进行索引。

        如果你想全局添加存根,你仍然可以,但我不确定是否 它的目的是功能。即使intelephense.stubs 发出警告 不正确的值实际上可以放任何文件夹名称。

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

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

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

        在我的情况下,我需要 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
        

        【讨论】:

        • ...(I use VSCode, but it should work the same for Visual Studio Code)...嗯?
        • 是的,把名字搞砸了,以为问题是关于 Visual Studio 的
        【解决方案16】:

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

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

        我仍然收到消息

        b) 将包含依赖库的供应商文件夹添加到工作区

        这似乎解决了问题。

        【讨论】:

        • 你可以使用laravel-ide-helper
        • 感谢您的提示。我在 Drupal 中使用 Symfony。 laravel-ide-helper 有帮助吗?
        【解决方案17】:
         use Illuminate\Support\Facades\Route;
        

        添加上面的命名空间

        【讨论】:

        • 这不符合 PSR 标准
        • @francisco 声明类别名如何违反 PSR 标准?哪个 PSR?
        • @miken32 如果存在,所有use 声明必须在namespace 声明之后。 (不高于)
        • @francisco "above" 引用了示例中的声明。换句话说,“添加命名空间,如上所示。”
        • 不管怎样,这个答案是already given问题提出后的第二天......
        【解决方案18】:

        在你的 web.php 中

        添加这行代码

        use Illuminate\Support\Facades\Route;
        

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

        use Illuminate\Support\Facades\Auth;
        

        谢谢。

        【讨论】:

          猜你喜欢
          • 2019-10-06
          • 2021-03-08
          • 2016-03-08
          • 1970-01-01
          • 2020-07-23
          • 1970-01-01
          • 2018-03-19
          相关资源
          最近更新 更多