web-dev-qa-db-fra.com

Code Visual Studio PHP Intelephense continue d'afficher une erreur non nécessaire

Après la dernière mise à jour de PHP Intelephense que je reçois aujourd'hui, l'intelephense continue d'afficher une erreur pour un symbole non défini pour mon itinéraire (et d'autres classes aussi), il n'y a pas d'erreur comme celle-ci auparavant et c'est m'ennuyer.

Voici la capture d'écran d'erreur:

enter image description here

Et voici mon code:

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

En fait, il n'y a pas d'erreur dans ce code, mais l'intéléphense continue d'afficher une erreur, existe-t-il un moyen de résoudre ce problème?

141
Adrian Edy Pratama

Intelephense 1.3 a ajouté des diagnostics de type, de fonction, de constante, de constante de classe, de méthode et de propriété non définis, alors qu'auparavant, en 1.2, il n'y avait que des diagnostics de variable non définis.

Certains frameworks sont écrits de manière à fournir des raccourcis pratiques pour l'utilisateur, mais rendent difficile pour les moteurs d'analyse statique de découvrir les symboles disponibles au moment de l'exécution.

Les générateurs de stub comme https://github.com/barryvdh/laravel-ide-helper aident à combler l'écart ici et à l'utiliser avec Laravel prendra soin de beaucoup de les faux diagnostics en fournissant des définitions concrètes de symboles qui peuvent être facilement découverts.

Pourtant, PHP est un langage très flexible et il peut y avoir d'autres instances de faux symboles non définis selon la façon dont le code est écrit. Pour cette raison, depuis 1.3.3, intelephense a des options de configuration pour activer/désactivez chaque catégorie de symbole non défini pour l'adapter à l'espace de travail et au style de codage.

Ces options sont les suivantes: intelephense.diagnostics.undefinedTypesintelephense.diagnostics.undefinedFunctionsintelephense.diagnostics.undefinedConstantsintelephense.diagnostics.undefinedClassConstantsintelephense.diagnostics.undefinedMethodsintelephense.diagnostics.undefinedPropertiesintelephense.diagnostics.undefinedVariables

Définir tout cela sur false sauf intelephense.diagnostics.undefinedVariables donnera le comportement de la version 1.2. Voir l'interface utilisateur des paramètres VSCode et recherchez intelephense.

89
bmewburn

La version 1.3.0 a un défaut IMO.
Le passage à la version 1.2.3 résout mon problème.

Je suis dessus

  • Laravel 5.1
  • PHP 5.6.40

Downgrade to Version 1.2.3

119
Robin1990

Vous n'avez pas besoin de rétrograder, vous pouvez:

Soit désactiver les diagnostics de symboles non définis dans les paramètres - "intelephense.diagnostics.undefinedSymbols": false.

Ou utilisez un assistant ide qui ajoute des talons pour les façades laravel. Voir https://github.com/barryvdh/laravel-ide-helper

18
Nacho

1.3.1 l'a corrigé.

Mettez simplement à jour votre extension et vous devriez être prêt à partir

14
Souljacker
use Illuminate\Support\Facades\Route;

je viens d'importer cela et l'avertissement disparaît pour moi.

  • Larvel 6+
  • vscode version 1.40.2
  • php intelephense 1.3.1
13
user12483351

Cette solution peut vous aider si vous savez que vos problèmes sont limités aux façades et que vous exécutez Laravel 5.5 ou supérieur).

Installez laravel-ide-helper

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

Ajoutez cette instruction conditionnelle dans votre AppServiceProvider pour enregistrer la classe d'assistance.

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

Exécutez ensuite php artisan ide-helper:generate pour générer un fichier pour aider les IDE à comprendre les façades. Vous devrez redémarrer Visual Studio Code.

Références

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

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

9
Patrice Wrex

Il s'agit vraiment d'un ensemble de configurations permettant à votre éditeur de comprendre Laravel.

Si vous souhaitez tout configurer manuellement, voici le repo . C'est pour le code VS et PhpStorm.

Ou si vous voulez, vous pouvez télécharger ce package . (J'ai créé) recommandé de l'installer globalement.

Et puis exécutez simplement andylaravel setupIDE. cela configurera tout pour vous selon le premier dépôt.

6
Andy Song

Non, les erreurs se produisent uniquement après la mise à jour automatique de l'extension Intelephense.

Pour résoudre le problème, vous pouvez le rétrograder vers la version précédente en cliquant sur "Installer une autre version" dans l'extension Intelephense. Il n'y a aucune erreur sur la version 1.2.3.

5
exyna

Pour ceux qui préfèrent rester simple, stupide; Si vous préférez vous débarrasser des notifications au lieu d'installer un assistant ou de rétrograder, désactivez simplement l'erreur dans votre settings.json en ajoutant ceci:

"intelephense.diagnostics.undefinedTypes": false
0
Conrad Warhol

Voici que j'ai résolu:

Ouvrez les paramètres d'extension:

enter image description here

Et recherchez la variable que vous souhaitez modifier, et décochez-la/cochez-la

enter image description here

Les variables à considérer sont:

intelephense.diagnostics.undefinedTypes 
intelephense.diagnostics.undefinedFunctions         
intelephense.diagnostics.undefinedConstants         
intelephense.diagnostics.undefinedClassConstants 
intelephense.diagnostics.undefinedMethods 
intelephense.diagnostics.undefinedProperties 
intelephense.diagnostics.undefinedVariables
0
Elia Weiss

J'ai eu le même problème et les éléments suivants semblent avoir résolu le problème.

a) Mise à jour vers la dernière version 1.3.5 et réactivation de tous les paramètres de diagnostic.

Je recevais toujours les messages

b) Ajout du dossier fournisseur avec les bibliothèques dépendantes à l'espace de travail

Cela semble avoir résolu le problème.

0
anoopjohn

Si vous voyez cela immédiatement après l'ajout d'une nouvelle classe Vendor, assurez-vous d'exécuter la commande VScode (control-shift-P) Index Workspace

0
Snapey

1.3.3 l'a corrigé. Mettez simplement à jour votre extension.

0
Hossein

Pour quiconque traverse ces problèmes et hésite à désactiver un ensemble complet de vérifications, il existe un moyen de transmettre vos propres signatures personnalisées à Intelephense (j'utilise VSCode , mais cela devrait fonctionner de la même manière pour Visual Studio Code).

Copié du commentaire du repo Intelephese (par @KapitanOczywisty):
https://github.com/bmewburn/vscode-intelephense/issues/892#issuecomment-5658521

Pour un espace de travail unique, c'est très simple, vous devez créer .php fichier avec toutes les signatures et intelephense les indexera.

Si vous souhaitez ajouter des stubs à l'échelle mondiale, vous pouvez toujours le faire, mais je ne sais pas si c'est prévu fonctionnalité. Même si intelephense.stubs jette un avertissement sur une valeur incorrecte, vous pouvez en fait y mettre n'importe quel nom de dossier .

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

Remarque: les talons sont actualisés avec ce changement de paramètre.

Vous pouvez jeter un œil aux talons intégrés ici: https://github.com/JetBrains/phpstorm-stubs

Dans mon cas, j'avais besoin que le describe, beforeEach, it... de dspec ne soit pas mis en surbrillance en tant qu'erreurs, donc j'ai simplement inclus le fichier avec les signatures /directories_and_paths/app/vendor/bin/dspec dans les paramètres de l'espace de travail de mon VSCode, qui comportaient les déclarations de fonction dont j'avais besoin:

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

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

// ... and so on
0
jpenna