รหัส Visual Studio PHP Intelephense Keep แสดงข้อผิดพลาดที่ไม่จำเป็น


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

ที่จริงแล้วไม่มีข้อผิดพลาดในรหัสนี้ แต่ intelephense ยังคงแสดงข้อผิดพลาดจึงมีวิธีการแก้ไขหรือไม่


ฉันได้รายงานปัญหานี้แล้วที่คิวปัญหาของแอปพลิเคชัน - github.com/bmewburn/vscode-intelephense/issues/885
anoopjohn

หากคุณได้รับข้อผิดพลาดที่ไม่ได้กำหนดบนเส้นทางในของคุณapi.phpโปรดดูที่ @ user12483351 คำตอบของด้านล่าง นั่นแก้ไขให้ฉัน ฉันใช้ Intelephese 1.3.6
dotNET

คำตอบ:


103

Intelephense 1.3 ได้เพิ่มประเภทฟังก์ชั่นค่าคงที่ค่าคงที่ระดับวิธีและการวินิจฉัยคุณสมบัติซึ่งก่อนหน้านี้ใน 1.2 มีการวินิจฉัยตัวแปรที่ไม่ได้กำหนดเท่านั้น

เฟรมเวิร์กบางตัวเขียนในลักษณะที่ให้ทางลัดที่สะดวกสำหรับผู้ใช้ แต่ทำให้เป็นเรื่องยากสำหรับเอ็นจิ้นการวิเคราะห์แบบคงที่เพื่อค้นหาสัญลักษณ์ที่มีในรันไทม์

กำเนิด Stub เช่น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 ดู VSCode การตั้งค่า UI intelephenseและค้นหา


ผ่านไปสองสามวันด้วยการแจ้งเตือนที่น่ารำคาญตอนนี้พร้อมอัปเดตล่าสุด 1.3.3 - ไม่เป็นไร .. ขอบคุณ @bmewburn
Tariqul Islam

1
ขอบคุณสำหรับการกำหนดค่าแยกตอนนี้ฉันปิดการใช้งาน undefinedMethods เนื่องจาก intelephense ไม่สามารถตรวจพบผู้ช่วยเหลือ laravel auth()->user()ในฐานะ class \ App \ User ดังนั้นวิธีการโทรภายใน \ App \ User จากauth()->user()จะถูกตรวจพบว่าเป็นข้อผิดพลาด ฉันเพิ่งเพิ่มuse Illuminate\Support\Facades\Route;ในเส้นทางของฉันเพื่อแก้ไขข้อผิดพลาดเส้นทางสัญลักษณ์ที่ไม่ได้กำหนด
Christhofer Natalius

2
ขอบคุณสำหรับสิ่งนี้. สำหรับการตั้งค่าของฉันเพียง diable intelephense.diagnostics.undefinedMethodsและใช้intelephense.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 ได้รับการติดตั้งข้อผิดพลาดทุกที่ การตั้งค่าเวอร์ชัน PHP เป็น 5.3.3 ในการตั้งค่าส่วนขยาย Intelephense ("intelephense.environment.phpVersion": "5.3.3") ไม่ได้ทำอะไรเลย ย้อนกลับไปที่ 1.2.3 ได้รับการแก้ไข
Ben

2
@Alex มีปัญหาอื่น ๆ คุณจะได้รับข้อผิดพลาดสำหรับขอบเขตแบบสอบถาม ฯลฯ นี่ไม่ใช่แค่ส่วนหน้า
Miloslav Milo Janoušek

2
Intelephense 1.3.3 เพิ่มตัวเลือกการกำหนดค่าเพิ่มเติมเพื่อให้เหมาะกับพื้นที่ทำงานและรูปแบบการเข้ารหัสของคุณ การวินิจฉัยที่ไม่ได้กำหนดแต่ละประเภทสามารถเปิด / ปิดการใช้งานให้เหมาะสม
bmewburn

19

คุณไม่จำเป็นต้องปรับลดรุ่นคุณสามารถ:

ปิดใช้งานการวิเคราะห์สัญลักษณ์ที่ไม่ได้กำหนดในการตั้งค่า - "intelephense.diagnostics.undefinedSymbols": false

หรือใช้ผู้ช่วย IDE ที่เพิ่มส่วนย่อยสำหรับส่วนหน้า laravel ดูhttps://github.com/barryvdh/laravel-ide-helper


3
IDE Helper แก้ปัญหาเกี่ยวกับการปิดเส้นทางหรือการปิดอื่น ๆ แต่คุณจะพบข้อผิดพลาดอื่น ๆ ในขณะที่ใช้ขอบเขตการพูด ฯลฯ
Miloslav Milo Janoušek

3
ดังนั้นเพื่อแก้ปัญหาเราจำเป็นต้องสูญเสียการวินิจฉัยที่แท้จริง ไม่มีทาง Josei!
Carlos Mora

ฉันติดตั้ง IDE Helper และสร้างไฟล์ตามคำแนะนำ .. นี่เป็นโครงการ Laravel ดูเหมือนว่าจะไม่มีอะไรเปลี่ยนแปลงและยังมีสัญลักษณ์ที่ไม่ได้กำหนดทั่วทุกสถานที่ ดังนั้นฉันปรับลดรุ่นเป็น 1.2.3
vesperknight

15
use Illuminate\Support\Facades\Route;

คำเตือนหายไปหลังจากนำเข้าเนมสเปซที่เกี่ยวข้อง

รุ่นของ

  • Larvel 6+
  • vscode เวอร์ชั่น 1.40.2
  • php intelephense 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 ไปได้เลย!
Carlos Mora

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 ใหม่

อ้างอิง

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

intelephense หยุดไฮไลต์Authหลังจากฉันรีสตาร์ท VS Code ฉันทำตามขั้นตอนที่แสดงในคำตอบนี้อย่างแน่นอน หลังจากรีสตาร์ทรหัส VS ให้เวลาหนึ่งหรือสองนาทีและข้อผิดพลาดควรชัดเจน
agm1984

6

นี่เป็นชุดของการกำหนดค่าจริงๆสำหรับโปรแกรมแก้ไขเพื่อทำความเข้าใจ Laravel

หากคุณต้องการที่จะกำหนดค่าทั้งหมดด้วยตนเองที่นี่เป็นrepo นี่คือทั้งรหัส VS และ PhpStorm

หรือถ้าคุณต้องการคุณสามารถดาวน์โหลดแพ็คเกจนี้ (ฉันสร้าง) แนะนำให้ติดตั้งทั่วโลก

andylaravel setupIDEและเรียกใช้เพียง นี้จะกำหนดค่าทุกอย่างสำหรับคุณตาม repo กำปั้น


5

ไม่ข้อผิดพลาดเกิดขึ้นเฉพาะหลังจากที่ส่วนขยาย Intelephense ได้รับการอัพเดตโดยอัตโนมัติ

เพื่อแก้ปัญหาคุณสามารถลดระดับเป็นรุ่นก่อนหน้าโดยคลิก "ติดตั้งรุ่นอื่น" ในส่วนขยาย Intelephense ไม่มีข้อผิดพลาดในรุ่น 1.2.3


1
การลดระดับเป็น 1.2.3 ช่วยแก้ปัญหาได้
Julitillo

2

หากคุณเห็นสิ่งนี้ทันทีหลังจากเพิ่มคลาสผู้ขายใหม่ให้แน่ใจว่าได้รันคำสั่ง 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

1.3.3 แก้ไข เพียงอัปเดตส่วนขยายของคุณ


ไม่เพียงแค่อัปเดต แต่คุณต้องปิดการใช้งานคุณลักษณะบางอย่างเช่นคำตอบ @bmewburn
Adrian Edy Pratama

0

ฉันมีปัญหาเดียวกันและดูเหมือนว่าต่อไปนี้จะได้รับการแก้ไขปัญหา

a) อัปเดตเป็นเวอร์ชั่นล่าสุด 1.3.5 และเปิดใช้งานการตั้งค่าการวินิจฉัยทั้งหมดอีกครั้ง

ฉันยังคงได้รับข้อความ

b) เพิ่มโฟลเดอร์ผู้จำหน่ายที่มีไลบรารีที่ขึ้นต่อกันเข้ากับพื้นที่ทำงาน

ดูเหมือนว่าจะแก้ปัญหาได้แล้ว


คุณสามารถใช้laravel-ide-helper
giovannipds

ขอบคุณสำหรับทิป. ฉันใช้ Symfony ใน Drupal laravel-ide-helper จะช่วยได้ไหม
anoopjohn

0

สำหรับใครก็ตามที่ประสบปัญหาเหล่านี้และไม่สบายใจเกี่ยวกับการปิดการใช้งานชุดตรวจสอบทั้งหมดมีวิธีการ ส่งลายเซ็นที่คุณกำหนดเองไปยัง Intelephense (ฉันใช้ VSCode แต่ควรทำงานเหมือนกันสำหรับ Visual Studio Code)

คัดลอกมาจากความคิดเห็นของ Intelephese repo (โดย @KapitanOczywisty):
https://github.com/bmewburn/vscode-intelephense/issues/892#issuecomment-565852100

สำหรับพื้นที่ทำงานเดียวมันง่ายมากคุณต้องสร้าง .phpไฟล์ที่มีลายเซ็นทั้งหมดและ intelephense จะสร้างดัชนีไฟล์

หากคุณต้องการเพิ่มต้นขั้วทั่วโลกคุณก็ยังทำได้ แต่ฉันไม่แน่ใจว่ามันเป็นคุณสมบัติที่ตั้งใจหรือไม่ แม้ว่าจะมีการintelephense.stubsแจ้งเตือนเกี่ยวกับค่าที่ไม่ถูกต้องคุณสามารถใส่ชื่อโฟลเดอร์ได้

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

หมายเหตุ: สตับจะถูกรีเฟรชด้วยการเปลี่ยนแปลงการตั้งค่านี้

คุณสามารถดู buildup แบบฝังได้ที่นี่: https://github.com/JetBrains/phpstorm-stubs

ในกรณีของฉันฉันต้องการของ dspec describe, beforeEach, it... เพื่อไม่ต้องเน้นเป็นข้อผิดพลาดดังนั้นฉันเพิ่งรวมไฟล์ที่มีลายเซ็น/directories_and_paths/app/vendor/bin/dspecในการตั้งค่าพื้นที่ทำงาน VSCode ของฉันซึ่งมีการประกาศฟังก์ชั่นที่ฉันต้องการ:

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

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

// ... and so on
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.