Visual Studio Code PHP Intelephense ciągle pokazuje niepotrzebny błąd


142

Po najnowszej aktualizacji PHP Intelephense, którą otrzymuję dzisiaj, intelephense wciąż wyświetla błąd dla niezdefiniowanego symbolu mojej trasy (i także innych klas), wcześniej nie ma takiego błędu i to mnie niepokoi.

Oto zrzut ekranu błędu:

wprowadź opis zdjęcia tutaj

A to jest mój kod:

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

W rzeczywistości nie ma błędu w tym kodzie, ale intelifense ciągle wyświetla błąd, więc czy istnieje sposób, aby to naprawić?


Zgłosiłem problem w tej kolejce problemów w aplikacji - github.com/bmewburn/vscode-intelephense/issues/885
anoopjohn

Jeśli otrzymujesz niezdefiniowany błąd na trasie w swoim api.php, zapoznaj się z odpowiedzią @ user12483351 poniżej. To naprawiło to dla mnie. Jestem na Intelephese 1.3.6.
dotNET

Odpowiedzi:


103

Intelephense 1.3 dodaje niezdefiniowaną diagnostykę typu, funkcji, stałej, klasy, metody i właściwości, podczas gdy wcześniej w 1.2 była tylko niezdefiniowana diagnostyka zmiennych.

Niektóre frameworki są napisane w sposób zapewniający wygodne skróty dla użytkownika, ale utrudniają silnikom analizy statycznej wykrywanie symboli dostępnych w czasie wykonywania.

Generatory skrótów, takie jak https://github.com/barryvdh/laravel-ide-helper, pomagają wypełnić lukę tutaj, a użycie tego z Laravelem zajmie się wieloma fałszywymi diagnozami, zapewniając konkretne definicje symboli, które można łatwo wykryć.

Mimo to PHP jest bardzo elastycznym językiem i mogą istnieć inne przypadki fałszywych niezdefiniowanych symboli, w zależności od tego, jak napisany jest kod. Z tego powodu, od 1.3.3, intelephense ma opcje konfiguracji, aby włączyć / wyłączyć każdą kategorię niezdefiniowanego symbolu w celu dopasowania do obszaru roboczego i stylu kodowania.

Te opcje to: intelephense.diagnostics.undefinedTypes intelephense.diagnostics.undefinedFunctions intelephense.diagnostics.undefinedConstants intelephense.diagnostics.undefinedClassConstants intelephense.diagnostics.undefinedMethods intelephense.diagnostics.undefinedProperties intelephense.diagnostics.undefinedVariables

Ustawienie wszystkich tych wartości na false intelephense.diagnostics.undefinedVariablesspowoduje zachowanie wersji 1.2. Zobacz interfejs użytkownika ustawień VSCode i wyszukaj intelephense.


Minęło kilka dni z irytującymi alertami, teraz z najnowszą aktualizacją 1.3.3 - wszystko jest w porządku .. Dzięki @bmewburn
Tariqul Islam

1
Dzięki za osobną konfigurację, na razie wyłączyłem undefinedMethods, ponieważ intelephense nie może wykryć pomocnika laravel auth()->user()jako klasy \ App \ User, więc metoda wywołania wewnątrz \ App \ User from auth()->user()zostanie wykryta jako błąd. Właśnie dodałem use Illuminate\Support\Facades\Route;w swoich trasach, aby naprawić błąd niezdefiniowanej trasy symbolu.
Christhofer Natalius,

2
Dzięki za to. Dla mojej konfiguracji, po prostu diable intelephense.diagnostics.undefinedMethodsi intelephense.diagnostics.undefinedTypedziała.
kamudrikah

laravel-ide-helpernaprawiono ostrzeżenie. Dziękuję Ci!
giovannipds

Wystarczy wygenerować _ide_helper.phpzgodnie z sugestiami w dokumentach.
giovannipds

121

Wersja 1.3.0 ma wadę IMO.
Powrót do wersji 1.2.3 rozwiązuje mój problem.

Jestem na

  • Laravel 5.1
  • PHP 5.6.40

Przejdź na wersję 1.2.3


3
Tak, myślę, że to najlepsza odpowiedź, problemem jest nowa wersja
Adrian Edy Pratama

Tak! Miałem dokładnie ten sam problem, który zaczął się godzinę temu, gdy Intelephense został zaktualizowany do wersji 1.3.0 - obniżono go do wersji 1.2.3.
leo

1
Dla mnie to samo. Pracuję nad projektem w PHP 5.3.3. Po zainstalowaniu 1.3 błędy wszędzie. Ustawienie wersji PHP na 5.3.3 w ustawieniu rozszerzenia Intelephense („intelephense.environment.phpVersion”: „5.3.3”) nic nie zrobiło. Powrót do wersji 1.2.3 naprawił to.
Ben

2
@Alex Istnieją inne problemy. Dostaniesz błędy w zakresie zapytań itp. To nie są tylko fasady.
Miloslav Milo Janoušek,

2
Intelephense 1.3.3 dodaje kolejne opcje konfiguracji, aby pasowały do ​​twojego obszaru roboczego i stylu kodowania. Każdą kategorię niezdefiniowanej diagnostyki można teraz włączyć / wyłączyć w celu dopasowania.
bmewburn,

19

Nie musisz obniżać wersji, możesz:

Albo wyłącz niezdefiniowaną diagnostykę symboli w ustawieniach - „intelephense.diagnostics.undefinedSymbols”: false.

Lub użyj pomocnika ide, który dodaje odcinki do fasad laravel. Zobacz https://github.com/barryvdh/laravel-ide-helper


3
Pomocnik IDE rozwiązuje problemy z zamknięciem trasy lub innymi zamknięciami, ale napotkasz inne błędy podczas korzystania z elokwentnych zakresów itp.
Miloslav Milo Janoušek

3
Aby rozwiązać problem, musimy utracić prawdziwą diagnostykę. Nie ma mowy, Josei!
Carlos Mora,

Zainstalowałem IDE Helper i wygenerowałem plik zgodnie z instrukcjami. To jest projekt Laravel. Wyglądało na to, że nic nie zmienia i wciąż ma nieokreślone symbole w całym miejscu. Więc
obniżyłem

15
use Illuminate\Support\Facades\Route;

Ostrzeżenie Zniknęło po zaimportowaniu odpowiedniej przestrzeni nazw.

Wersja

  • Larvel 6+
  • wersja vscode 1.40.2
  • php intelephense 1.3.1

To faktycznie rozwiązuje problem. W przypadku poleceń w pliku console.php działa również z: użyj Illuminate \ Support \ Facades \ Artisan;
Alex

To nie jest zalecane laravel. laravel-ide-helperkonfiguracja jest.
giovannipds

Dodanie tego rozwiązało problem Route, ale miałem ten sam błąd Auth, więc też dodałem use Illuminate\Support\Facades\Auth;. Problem rozwiązany.
Daydah

13

1.3.1 to naprawiło.

Po prostu zaktualizuj swoje rozszerzenie i powinieneś już iść


22
Jestem już w wersji 1.3.1, ale błąd nadal się wyświetla.
ultrasamad

Ja też, czy jest poprawka, czy powinniśmy obniżyć wersję?
tonix,

3
Dla mnie to niczego nie rozwiązuje. Powrót do 1.2.3 idzie dobrze!
Carlos Mora,

1
1.3.1 nadal ma dla mnie ten problem. 1.2.3 naprawiono
wskaźnik NULL

2
Jestem na 1.3.2 i nadal NIE jest naprawiony. Ponownie obniżono do 1.2.3.
Alex

12

To rozwiązanie może ci pomóc, jeśli wiesz, że twoje problemy są ograniczone do elewacji i korzystasz z Laravel 5.5 lub nowszego.

Zainstaluj laravel-ide-helper

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

Dodaj tę instrukcję warunkową, AppServiceProvideraby zarejestrować klasę pomocnika.

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

Następnie uruchom, php artisan ide-helper:generateaby wygenerować plik, który pomoże IDE zrozumieć Fasady. Musisz ponownie uruchomić program Visual Studio Code.

Bibliografia

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

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


1
Problem polega na tym, że otrzymujesz zduplikowane definicje
Carlos Mora,

@ CarlosMora wydaje mi się nie. Nie rozumiem, co miałeś na myśli ...
giovannipds

Używam laravel 6.x i działa.
hakiko

laravel 7 też działa
alfian5229

intelephense przestał podświetlać Authpo ponownym uruchomieniu kodu VS Code. Zrobiłem dokładnie kroki przedstawione w tej odpowiedzi. Po ponownym uruchomieniu kodu VS daj mu minutę lub dwie, a błędy powinny zostać usunięte.
agm1984

6

To jest naprawdę zestaw konfiguracji dla twojego edytora do zrozumienia Laravela.

Jeśli chcesz to wszystko skonfigurować ręcznie, oto repozytorium . Dotyczy to zarówno kodu VS, jak i PhpStorm.

Lub jeśli chcesz, możesz pobrać ten pakiet . (Stworzyłem) Zalecam, aby zainstalować go globalnie.

A potem po prostu biegnij andylaravel setupIDE. to wszystko skonfiguruje dla ciebie zgodnie z repozytorium pięści.


5

Nie, błędy występują tylko po automatycznej aktualizacji rozszerzenia Intelephense.

Aby rozwiązać problem, możesz obniżyć go do poprzedniej wersji, klikając „Zainstaluj inną wersję” w rozszerzeniu Intelephense. Nie ma błędów w wersji 1.2.3.


1
Obniżenie wersji do 1.2.3 rozwiązało problem.
Julitillo

2

Jeśli zobaczysz to natychmiast po dodaniu nowej klasy dostawcy, pamiętaj, aby uruchomić polecenie VScode (control-shift-P) Index Workspace


1

Oto rozwiązane:

Otwórz ustawienia rozszerzenia:

wprowadź opis zdjęcia tutaj

Poszukaj zmiennej, którą chcesz zmienić, i odznacz ją / zaznacz

wprowadź opis zdjęcia tutaj

Zmienne, które należy wziąć pod uwagę to:

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

1

Ci woleliby, żeby to było proste, głupie; Jeśli wolisz pozbyć się powiadomień zamiast instalować pomocnika lub obniżyć wersję, po prostu wyłącz błąd w swoim pliku, settings.jsondodając:

"intelephense.diagnostics.undefinedTypes": false

0

1.3.3 to naprawiło. Po prostu zaktualizuj swoje rozszerzenie.


nie tylko go zaktualizuj, ale musisz wyłączyć niektóre funkcje, takie jak odpowiedź @bmewburn
Adrian Edy Pratama,

0

Miałem ten sam problem i wydawało się, że rozwiązałem ten problem.

a) Zaktualizowano do najnowszej wersji 1.3.5 i ponownie włączył wszystkie ustawienia diagnostyczne.

Nadal otrzymywałem wiadomości

b) Dodano folder dostawcy z bibliotekami zależnymi do obszaru roboczego

Wydaje się, że to rozwiązało problem.


Możesz użyćlaravel-ide-helper
giovannipds

Dzięki za wskazówkę. Używam Symfony w Drupal. Czy laravel-ide-helper pomógłby?
anoopjohn

0

Dla każdego, kto przechodzi przez te problemy i nie jest łatwo wyłączyć cały zestaw kontroli, istnieje sposób na przesłanie własnych niestandardowych podpisów do Intelephense (używam VSCode, ale powinien działać tak samo dla Visual Studio Code).

Skopiowano z komentarza repozytorium Intelephese (autor: @KapitanOczywisty):
https://github.com/bmewburn/vscode-intelephense/issues/892#issuecomment-565852100

Dla pojedynczego obszaru roboczego jest to bardzo proste, musisz utworzyć .phpplik ze wszystkimi podpisami, a intelefense je zindeksuje.

Jeśli chcesz dodać kody pośredniczące na całym świecie, nadal możesz, ale nie jestem pewien, czy jest to zamierzona funkcja . Nawet jeśli intelephense.stubswyśle ​​ostrzeżenie o niepoprawnej wartości, w rzeczywistości możesz umieścić tam dowolną nazwę folderu .

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

Uwaga: kody pośredniczące są odświeżane przy tej zmianie ustawienia.

Możesz zobaczyć wbudowane kody pośredniczące tutaj: https://github.com/JetBrains/phpstorm-stubs

W moim przypadku potrzebne dspec na describe, beforeEach,it ..., aby nie być zaznaczony jako błędy, więc po prostu wliczone plik z podpisami /directories_and_paths/app/vendor/bin/dspecw moich ustawieniach przestrzeni roboczej VSCode, który miał mi potrzebne deklaracje funkcji:

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

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

// ... and so on
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.